From 1a1d77dd589de5a567fa95e36aa6999c704ceca4 Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Mon, 28 Aug 2000 22:00:09 +0000 Subject: Merge with 2.4.0-test7. --- arch/arm/Makefile | 77 +++++++----------- arch/arm/boot/Makefile | 90 +++++++++++++++++++- arch/arm/boot/bootp/Makefile | 26 ++++++ arch/arm/boot/bootp/init.S | 57 +++++++++++++ arch/arm/boot/compressed/Makefile | 55 +++---------- arch/arm/boot/compressed/head-l7200.S | 30 +++++++ arch/arm/boot/compressed/head-netwinder.S | 38 +++++---- arch/arm/boot/compressed/head-sa1100.S | 28 +------ arch/arm/boot/compressed/head.S | 29 +++++-- arch/arm/boot/compressed/hw-bse.c | 74 +++++++++++++++++ arch/arm/boot/compressed/setup-sa1100.S | 26 ++++-- arch/arm/config.in | 92 +++++++++++++-------- arch/arm/kernel/Makefile | 11 ++- arch/arm/kernel/arch.c | 56 ++++++++++++- arch/arm/kernel/armksyms.c | 10 ++- arch/arm/kernel/bios32.c | 33 ++++++-- arch/arm/kernel/calls.S | 3 +- arch/arm/kernel/debug-armv.S | 8 +- arch/arm/kernel/dec21285.c | 2 +- arch/arm/kernel/dma-arc.c | 1 + arch/arm/kernel/dma-rpc.c | 2 +- arch/arm/kernel/dma.c | 25 +++--- arch/arm/kernel/ecard.c | 25 +++--- arch/arm/kernel/entry-armo.S | 18 +--- arch/arm/kernel/entry-armv.S | 16 ++-- arch/arm/kernel/entry-common.S | 24 ++++-- arch/arm/kernel/fiq.c | 7 +- arch/arm/kernel/head-armo.S | 87 +++++++++++++------- arch/arm/kernel/head-armv.S | 44 ++++++---- arch/arm/kernel/hw-footbridge.c | 2 +- arch/arm/kernel/hw-sa1100.c | 35 +++++++- arch/arm/kernel/irq.c | 16 +--- arch/arm/kernel/leds-footbridge.c | 19 ++++- arch/arm/kernel/leds-sa1100.c | 106 +++++++++++++++++++++++- arch/arm/kernel/oldlatches.c | 5 +- arch/arm/kernel/process.c | 5 +- arch/arm/kernel/semaphore.c | 131 ++++++++++++++++++++++++++---- arch/arm/kernel/setup.c | 14 ++-- arch/arm/kernel/signal.c | 131 +++++++++++++++--------------- arch/arm/kernel/traps.c | 4 +- arch/arm/lib/Makefile | 5 +- arch/arm/lib/uaccess.S | 54 ++++++------ arch/arm/mm/Makefile | 9 +- arch/arm/mm/init.c | 46 +++++------ arch/arm/mm/mm-footbridge.c | 40 +++++---- arch/arm/mm/mm-l7200.c | 4 +- arch/arm/mm/mm-sa1100.c | 46 +++++++++++ arch/arm/mm/proc-arm720.S | 51 +++++++++++- arch/arm/mm/proc-sa110.S | 2 +- arch/arm/nwfpe/Makefile | 2 + arch/arm/tools/gen-mach-types | 73 +++++++++++++++++ arch/arm/tools/mach-types | 44 ++++++++++ 52 files changed, 1331 insertions(+), 507 deletions(-) create mode 100644 arch/arm/boot/bootp/Makefile create mode 100644 arch/arm/boot/bootp/init.S create mode 100644 arch/arm/boot/compressed/head-l7200.S create mode 100644 arch/arm/boot/compressed/hw-bse.c create mode 100644 arch/arm/tools/gen-mach-types create mode 100644 arch/arm/tools/mach-types (limited to 'arch/arm') diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 5bd7af915..81b78feb9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -48,7 +48,7 @@ NEW_GCC := $(shell if $(CC) --version 2>&1 | grep '^2\.7' > /dev/null; then ech # ifeq ($(NEW_GCC),y) CFLAGS += -mshort-load-bytes -CFLAGS_PROC_CPU_26 := -mcpu=arm3 -Os +CFLAGS_PROC_CPU_26 := -mcpu=arm3 -mapcs-26 -Os CFLAGS_PROC_CPU_32v3 := -march=armv3 CFLAGS_PROC_CPU_32v4 := -march=armv4 CFLAGS_ARM6 := -mtune=arm6 @@ -166,10 +166,9 @@ endif HEAD := arch/arm/kernel/head-$(PROCESSOR).o \ arch/arm/kernel/init_task.o SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib \ - arch/arm/special arch/arm/nwfpe + arch/arm/nwfpe CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES) LIBS := arch/arm/lib/lib.o arch/arm/lib/lib.a $(LIBS) $(LIBGCC) -DRIVERS += arch/arm/special/special.a ifeq ($(CONFIG_NWFPE),y) LIBS := arch/arm/nwfpe/math-emu.o $(LIBS) @@ -193,7 +192,14 @@ MAKEBOOT = $(MAKE) -C arch/$(ARCH)/boot # The following is a hack to get 'constants.h' up # to date before starting compilation -$(patsubst %, _dir_%, $(SUBDIRS)) : constants +$(patsubst %, _dir_%, $(SUBDIRS)) init/main.o init/version.o : \ + constants \ + include/asm-arm/mach-types.h + +include/asm-arm/mach-types.h: \ + arch/arm/tools/mach-types \ + arch/arm/tools/gen-mach-types + @awk -f arch/arm/tools/gen-mach-types arch/arm/tools/mach-types > $@ constants: $(TOPDIR)/include/asm-arm/proc-fns.h dummy @$(MAKE) -C arch/arm/lib constants.h @@ -218,16 +224,16 @@ arch/arm/mm: dummy arch/arm/lib: dummy $(MAKE) linuxsubdirs SUBDIRS=arch/arm/lib -zImage zinstall Image install: vmlinux +bzImage zImage zinstall Image bootpImage install: vmlinux @$(MAKEBOOT) $@ archmrproper: - @$(MAKE) -C arch/$(ARCH)/special mrproper $(RM) include/asm-arm/arch include/asm-arm/proc archclean: @$(MAKEBOOT) clean $(RM) arch/arm/lib/constants.h arch/arm/vmlinux.lds + $(RM) include/asm-arm/mach-types.h archdep: symlinks @$(MAKEBOOT) dep @@ -241,46 +247,25 @@ zi:; @$(MAKEBOOT) zinstall # # Configuration targets. Use these to select a # configuration for your architecture -# -a5k_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/a5k arch/arm/defconfig - -ebsa110_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/ebsa110 arch/arm/defconfig - -footbridge_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/footbridge arch/arm/defconfig - -rpc_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/rpc arch/arm/defconfig - -brutus_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/brutus arch/arm/defconfig - -victor_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/victor arch/arm/defconfig - -empeg_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/empeg arch/arm/defconfig - -thinclient_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/thinclient arch/arm/defconfig - -assabet_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/assabet arch/arm/defconfig - -lart_config: - $(RM) arch/arm/defconfig - cp arch/arm/def-configs/lart arch/arm/defconfig +CFGS= a5k_config ebsa110_config \ + footbridge_config rpc_config \ + brutus_config victor_config \ + empeg_config thinclient_config \ + assabet_config lart_config \ + cerf_config + +$(CFGS): + @( \ + CFG=$(@:_config=); \ + if [ -f arch/arm/def-configs/$$CFG ]; then \ + $(RM) arch/arm/defconfig; \ + cp arch/arm/def-configs/$$CFG arch/arm/defconfig; \ + echo "*** Default configuration for $$CFG installed"; \ + echo "*** Next, you may run 'make oldconfig'"; \ + else \ + echo "$$CFG does not exist"; \ + fi; \ + ) l7200_config: $(RM) arch/arm/defconfig diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile index d210b92c2..2811e80ef 100644 --- a/arch/arm/boot/Makefile +++ b/arch/arm/boot/Makefile @@ -5,20 +5,105 @@ # License. See the file "COPYING" in the main directory of this archive # for more details. # -# Copyright (C) 1995, 1996 Russell King +# Copyright (C) 1995-2000 Russell King # SYSTEM =$(TOPDIR)/vmlinux +ifeq ($(CONFIG_CPU_26),y) +ZTEXTADDR = 0x02080000 +PARAMS_PHYS = 0x0207c000 +INITRD_PHYS = 0x02180000 +INITRD_VIRT = 0x02180000 +endif + +ifeq ($(CONFIG_ARCH_RPC),y) +ZTEXTADDR = 0x10008000 +PARAMS_PHYS = 0x10000100 +INITRD_PHYS = 0x18000000 +INITRD_VIRT = 0xc8000000 +endif + +ifeq ($(CONFIG_ARCH_CLPS7500),y) +ZTEXTADDR = 0x10008000 +endif + +ifeq ($(CONFIG_ARCH_EBSA110),y) +ZTEXTADDR = 0x00008000 +PARAMS_PHYS = 0x00000400 +INITRD_PHYS = 0x00800000 +INITRD_VIRT = 0xc0800000 +endif + +ifeq ($(CONFIG_FOOTBRIDGE),y) +ZTEXTADDR = 0x00008000 +PARAMS = 0x00000100 +INITRD_PHYS = 0x00800000 +INITRD_VIRT = 0xc0800000 +endif + +ifeq ($(CONFIG_ARCH_NEXUSPCI),y) +ZTEXTADDR = 0x40200000 +ZRELADDR = 0x40008000 +endif + +ifeq ($(CONFIG_ARCH_L7200),y) +# RAM based kernel +#ZTEXTADDR = 0xf0400000 +#ZRELADDR = 0xf0008000 + +# FLASH based kernel +ZTEXTADDR = 0x00010000 +ZRELADDR = 0xf0008000 +ZBSSADDR = 0xf03e0000 +endif + +ifeq ($(CONFIG_ARCH_SA1100),y) +ZTEXTADDR = 0xc0008000 +ZRELADDR = 0xc0008000 +ifeq ($(CONFIG_SA1100_VICTOR),y) + ZTEXTADDR = 0x00002000 + ZBSSADDR = 0xc0100000 +endif +ifeq ($(CONFIG_SA1100_THINCLIENT),y) + ZTEXTADDR = 0xC0200000 +endif +ifeq ($(CONFIG_SA1100_GRAPHICSCLIENT),y) + ZTEXTADDR = 0xC0200000 +endif +endif + +# +# If you don't define ZRELADDR above, +# then it defaults to ZTEXTADDR +# +ifeq ($(ZRELADDR),) +ZRELADDR = $(ZTEXTADDR) +endif + +export SYSTEM ZTEXTADDR ZBSSADDR ZRELADDR INITRD_PHYS INITRD_VIRT PARAMS_PHYS + Image: $(CONFIGURE) $(SYSTEM) $(OBJCOPY) $(SYSTEM) $@ +bzImage: zImage + zImage: $(CONFIGURE) compressed/vmlinux $(OBJCOPY) compressed/vmlinux $@ +bootpImage: bootp/bootp + $(OBJCOPY) bootp/bootp $@ + compressed/vmlinux: $(TOPDIR)/vmlinux dep @$(MAKE) -C compressed vmlinux +bootp/bootp: zImage initrd + @$(MAKE) -C bootp bootp + +initrd: + @test "$(INITRD_VIRT)" != "" || (echo This architecture does not support INITRD; exit -1) + @test "$(INITRD)" != "" || (echo You must specify INITRD; exit -1) + install: $(CONFIGURE) Image sh ./install.sh $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) Image $(TOPDIR)/System.map "$(INSTALL_PATH)" @@ -26,7 +111,8 @@ zinstall: $(CONFIGURE) zImage sh ./install.sh $(VERSION).$(PATCHLEVEL).$(SUBLEVEL) zImage $(TOPDIR)/System.map "$(INSTALL_PATH)" clean: - rm -f Image zImage + $(RM) Image zImage bootpImage @$(MAKE) -C compressed clean + @$(MAKE) -C bootp clean dep: diff --git a/arch/arm/boot/bootp/Makefile b/arch/arm/boot/bootp/Makefile new file mode 100644 index 000000000..c513c8ad3 --- /dev/null +++ b/arch/arm/boot/bootp/Makefile @@ -0,0 +1,26 @@ +# +# linux/arch/arm/boot/bootp/Makefile +# + +ZSYSTEM =$(TOPDIR)/arch/arm/boot/zImage +INITRD =$(ZSYSTEM) +ZLDFLAGS =-p -X -T bootp.lds \ + --defsym initrd_addr=$(INITRD_PHYS) \ + --defsym initrd_virt=$(INITRD_VIRT) \ + --defsym params=$(PARAMS_PHYS) + +all: bootp + +# Note that bootp.lds picks up kernel.o and initrd.o +bootp: init.o kernel.o initrd.o bootp.lds + $(LD) $(ZLDFLAGS) -o $@ init.o + +kernel.o: $(ZSYSTEM) + $(LD) -r -s -o $@ -b binary $(ZSYSTEM) + +initrd.o: $(INITRD) + $(LD) -r -s -o $@ -b binary $(INITRD) + +.PHONY: $(INITRD) $(ZSYSTEM) + +clean:; $(RM) bootp bootp.lds diff --git a/arch/arm/boot/bootp/init.S b/arch/arm/boot/bootp/init.S new file mode 100644 index 000000000..c5682212f --- /dev/null +++ b/arch/arm/boot/bootp/init.S @@ -0,0 +1,57 @@ +/* + * Header file for splitting kernel + initrd. Note that we pass + * r0 through to r3 straight through. + */ + .section .start,#alloc,#execinstr + .type _entry, #function +_entry: +kernel_addr: adr r10, initdata + ldmia r10, {r11, r12} + sub r11, r10, r11 @ work out exec offset + add r12, r12, r11 @ correct "splitify" + mov pc, r12 @ jump to splitify + .size _entry,. - _entry + + .type initdata, #object +initdata: .word initdata @ compiled address of this + .word splitify + .size initdata,. - initdata + + .text +splitify: adr r13, data + ldmia r13!, {r4-r6} @ move the kernel + add r4, r4, r11 @ correction + mov r12, r5 + bl move + + ldmia r13!, {r4-r6} @ then the initrd + add r4, r4, r11 @ correction + bl move + + ldmib r13, {r5,r6,r7} @ get size and addr of initrd + add r7, r7, #16*4 @ offset of initrd_start in param_struct + stmia r7, {r5,r6} @ save in param_struct + mov pc, r12 @ call kernel + +move: ldmia r4!, {r7 - r10} @ move 32-bytes at a time + stmia r5!, {r7 - r10} + ldmia r4!, {r7 - r10} + stmia r5!, {r7 - r10} + subs r6, r6, #8 * 4 + bcs move + mov pc, lr + +data: .word kernel_start + .word kernel_addr + .word kernel_len + + .word initrd_start + .word initrd_addr + .word initrd_len + + .word initrd_virt + .word initrd_len + .word params + + .type kernel_start,#object + .type initrd_start,#object diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index f3c45c553..2a0108021 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -2,10 +2,13 @@ # linux/arch/arm/boot/compressed/Makefile # # create a compressed vmlinuz image from the original vmlinux +# +# Note! SYSTEM, ZTEXTADDR, ZBSSADDR and ZRELADDR are now exported +# from arch/arm/boot/Makefile +# HEAD = head.o OBJS = misc.o -SYSTEM = $(TOPDIR)/vmlinux CFLAGS = $(CPPFLAGS) -O2 -DSTDC_HEADERS $(CFLAGS_PROC) FONTC = $(TOPDIR)/drivers/video/font_acorn_8x8.c ZLDFLAGS = -p -X -T vmlinux.lds @@ -17,60 +20,25 @@ ifeq ($(CONFIG_ARCH_ACORN),y) OBJS += ll_char_wr.o font.o endif -ifeq ($(CONFIG_CPU_26),y) -ZTEXTADDR = 0x02080000 -endif - -ifeq ($(CONFIG_ARCH_RPC),y) -ZTEXTADDR = 0x10008000 -endif - -ifeq ($(CONFIG_ARCH_CLPS7500),y) -ZTEXTADDR = 0x10008000 -endif - -ifeq ($(CONFIG_ARCH_EBSA110),y) -ZTEXTADDR = 0x00008000 -endif - -ifeq ($(CONFIG_FOOTBRIDGE),y) -ZTEXTADDR = 0x00008000 -endif - ifeq ($(CONFIG_ARCH_NETWINDER),y) OBJS += head-netwinder.o endif ifeq ($(CONFIG_ARCH_NEXUSPCI),y) HEAD = head-nexuspci.o -ZTEXTADDR = 0x40200000 -ZRELADDR = 0x40008000 +endif + +ifeq ($(CONFIG_ARCH_L7200),y) +OBJS += head-l7200.o endif ifeq ($(CONFIG_ARCH_SA1100),y) OBJS += head-sa1100.o setup-sa1100.o -ZTEXTADDR = 0xc0008000 -ZRELADDR = 0xc0008000 -ifeq ($(CONFIG_SA1100_VICTOR),y) - ZTEXTADDR = 0x00002000 - ZBSSADDR = 0xc0100000 -endif -ifeq ($(CONFIG_SA1100_THINCLIENT),y) - ZTEXTADDR = 0xC0200000 -endif -ifeq ($(CONFIG_SA1100_GRAPHICSCLIENT),y) - ZTEXTADDR = 0xC0200000 +ifeq ($(CONFIG_SA1100_NANOENGINE),y) + OBJS += hw-bse.o endif endif -# -# If you don't define ZRELADDR above, -# then it defaults to ZTEXTADDR -# -ifeq ($(ZRELADDR),) -ZRELADDR = $(ZTEXTADDR) -endif - SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/; ifneq ($(ZBSSADDR),) @@ -104,3 +72,6 @@ clean:; rm -f vmlinux core piggy* vmlinux.lds .PHONY: vmlinux.lds clean misc.o: misc.c $(TOPDIR)/include/asm/arch/uncompress.h $(TOPDIR)/lib/inflate.c + +%.o: %.S + $(CC) $(AFLAGS) $(EXTRA_AFLAGS) $(AFLAGS_$@) -c -o $@ $< diff --git a/arch/arm/boot/compressed/head-l7200.S b/arch/arm/boot/compressed/head-l7200.S new file mode 100644 index 000000000..ecf4d6881 --- /dev/null +++ b/arch/arm/boot/compressed/head-l7200.S @@ -0,0 +1,30 @@ +/* + * linux/arch/arm/boot/compressed/head-l7200.S + * + * Copyright (C) 2000 Steve Hill + * + * Some code borrowed from Nicola Pitre's 'head-sa1100.S' file. This + * is merged with head.S by the linker. + */ + +#include + +#ifndef CONFIG_ARCH_L7200 +#error What am I doing here... +#endif + + .section ".start", #alloc, #execinstr + +__L7200_start: + + mov r0, #0x00100000 @ FLASH address of initrd + mov r2, #0xf1000000 @ RAM address of initrd + add r1, r2, #0x00700000 @ Size of initrd +1: + ldmia r0!, {r3, r4, r5, r6} + stmia r2!, {r3, r4, r5, r6} + cmp r2, r1 + ble 1b + + mov r8, #0 @ Zero it out + mov r7, #19 @ Set architecture ID diff --git a/arch/arm/boot/compressed/head-netwinder.S b/arch/arm/boot/compressed/head-netwinder.S index 489bb4d96..eca1d773d 100644 --- a/arch/arm/boot/compressed/head-netwinder.S +++ b/arch/arm/boot/compressed/head-netwinder.S @@ -1,15 +1,24 @@ +#define K(a,b,c) ((a) << 24 | (b) << 12 | (c)) + .section ".start", #alloc, #execinstr + /* + * check to see if we are running from the correct address. + * If not, we move ourselves in a two stage process. Firstly, + * we copy the start of the kernel (which includes this code) + * to 0x8000, and then jump to this code to continue with the + * rest (since this code will get overwritten). + */ adr r2, 1f - ldmdb r2, {r7, r8} + ldmdb r2, {r9, r10} and r3, r2, #0xc000 - teq r3, #0x8000 - beq 2f + teq r3, #0x8000 @ correctly located? + beq 2f @ skip this code bic r3, r2, #0xc000 orr r3, r3, #0x8000 - mov r0, r3 - mov r4, #64 - sub r5, r8, r7 + mov r0, r3 @ new address if '1' + mov r4, #64 @ number of bytes to copy + sub r5, r10, r9 @ total number of bytes to copy b 1f .word _start @@ -17,15 +26,16 @@ 1: .rept 4 - ldmia r2!, {r6, r7, r8, r9} - stmia r3!, {r6, r7, r8, r9} + ldmia r2!, {r6, r9, r10, r11} + stmia r3!, {r6, r9, r10, r11} .endr subs r4, r4, #64 bcs 1b - movs r4, r5 - mov r5, #0 - mov r1, #5 @ only here to fix NeTTroms which dont set r1 - movne pc, r0 - - mov r0, #0 + movs r4, r5 @ remaining length + mov r5, #0 @ no more to copy + movne pc, r0 @ jump back to 1 (in the newly copied + @ code) + mov r7, #5 @ only here to fix NeTTroms which dont + mov r8, #2 << 24 @ scheduled for removal in 2.5.xx + orr r8, r8, #5 << 12 2: diff --git a/arch/arm/boot/compressed/head-sa1100.S b/arch/arm/boot/compressed/head-sa1100.S index 6b0d4624d..73cef4bd8 100644 --- a/arch/arm/boot/compressed/head-sa1100.S +++ b/arch/arm/boot/compressed/head-sa1100.S @@ -9,6 +9,7 @@ #include #include +#include #ifndef CONFIG_ARCH_SA1100 #error What am I doing here... @@ -18,27 +19,10 @@ __SA1100_start: - @ Preserve r0/r1 i.e. kernel entry values - mov r8, r0 - mov r9, r1 - -#if defined( CONFIG_SA1100_ASSABET ) || \ - defined( CONFIG_SA1100_BRUTUS ) || \ - defined( CONFIG_SA1100_THINCLIENT ) -@ Booting from Angel -- need to enter SVC mode -#define angel_SWIreason_EnterSVC 0x17 /* from arm.h, in angel source */ -#define angel_SWI_ARM (0x123456) - mov r0, #angel_SWIreason_EnterSVC - swi #angel_SWI_ARM - - @ turn off interrupts to prevent the angel from running - mrs r0, cpsr - orr r0, r0, #0xc0 - msr cpsr_c, r0 -#endif + @ Preserve r8/r7 i.e. kernel entry values #ifdef CONFIG_SA1100_VICTOR - teq r9, #26 @ MACH_TYPE_VICTOR + teq r7, #MACH_TYPE_VICTOR bne 10f @ Copy cmdline to 0xc0000000 @@ -74,10 +58,6 @@ __SA1100_start: * Pause for a short time so that we give enough time * for the host to start a terminal up. */ - mov r0, #0x02000000 + mov r0, #0x00200000 1: subs r0, r0, #1 bne 1b - - @ Restore initial r0/r1 - mov r0, r8 - mov r1, r9 diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S index 10c2290a0..ef9090f72 100644 --- a/arch/arm/boot/compressed/head.S +++ b/arch/arm/boot/compressed/head.S @@ -3,9 +3,9 @@ * * Copyright (C) 1996-1999 Russell King */ +#include #include - /* * Debugging stuff */ @@ -84,18 +84,31 @@ start: b 1f .word 0x016f2818 @ Magic numbers to help the loader .word start -1: +1: mov r7, r1 @ save architecture ID + mov r8, r0 @ save r0 +#ifdef CONFIG_ANGELBOOT + /* + * Booting from Angel - need to enter SVC mode and disable + * FIQs/IRQs (numeric definitions from angel arm.h source) + */ + mov r0, #0x17 @ angel_SWIreason_EnterSVC + swi 0x123456 @ angel_SWI_ARM + mrs r0, cpsr @ turn off interrupts to + orr r0, r0, #0xc0 @ prevent angel from running + msr cpsr_c, r0 + + /* + * Note that some cache flushing and other stuff may + * be needed here - is there an Angel SWI call for this? + */ +#endif /* * some architecture specific code can be inserted - * by the linker here, but it should preserve r0, r1 - * and r8. + * by the linker here, but it should preserve r7 and r8. */ .text -1: teq r0, #0 - bne 1b - mov r7, r1 @ save architecture ID - mrc p15, 0, r6, c0, c0 @ get processor ID +1: mrc p15, 0, r6, c0, c0 @ get processor ID adr r2, LC0 ldmia r2, {r2, r3, r4, r5, sp} diff --git a/arch/arm/boot/compressed/hw-bse.c b/arch/arm/boot/compressed/hw-bse.c new file mode 100644 index 000000000..3e8f07f8e --- /dev/null +++ b/arch/arm/boot/compressed/hw-bse.c @@ -0,0 +1,74 @@ +/* + * Bright Star Engineering Inc. + * + * code for readng parameters from the + * parameter blocks of the boot block + * flash memory + * + */ + +static int strcmp(const char *s1, const char *s2) +{ + while (*s1 != '\0' && *s1 == *s2) + { + s1++; + s2++; + } + + return (*(unsigned char *) s1) - (*(unsigned char *) s2); +} + +struct pblk_t { + char type; + unsigned short size; +}; + +static char *bse_getflashparam(char *name) { + unsigned int esize; + char *q,*r; + unsigned char *p,*e; + struct pblk_t *thepb = (struct pblk_t *) 0x00004000; + struct pblk_t *altpb = (struct pblk_t *) 0x00006000; + if (thepb->type&1) { + if (altpb->type&1) { + /* no valid param block */ + return (char*)0; + } else { + /* altpb is valid */ + struct pblk_t *tmp; + tmp = thepb; + thepb = altpb; + altpb = tmp; + } + } + p = (char*)thepb + sizeof(struct pblk_t); + e = p + thepb->size; + while (p < e) { + q = p; + esize = *p; + if (esize == 0xFF) break; + if (esize == 0) break; + if (esize > 127) { + esize = (esize&0x7F)<<8 | p[1]; + q++; + } + q++; + r=q; + if (*r && ((name == 0) || (!strcmp(name,r)))) { + while (*q++) ; + return q; + } + p+=esize; + } + return (char*)0; +} + +void bse_setup(void) { + /* extract the linux cmdline from flash */ + char *name=bse_getflashparam("linuxboot"); + char *x = (char *)0xc0000100; + if (name) { + while (*name) *x++=*name++; + } + *x=0; +} diff --git a/arch/arm/boot/compressed/setup-sa1100.S b/arch/arm/boot/compressed/setup-sa1100.S index 6fd5b84e6..f7657773b 100644 --- a/arch/arm/boot/compressed/setup-sa1100.S +++ b/arch/arm/boot/compressed/setup-sa1100.S @@ -9,8 +9,9 @@ * Runtime test for Neponset added. */ -#define __ASSEMBLY__ #include +#include +#include .text @@ -44,6 +45,12 @@ SCR_loc: .long SYMBOL_NAME(SCR_value) #define GPIO_2_9 0x3fc +/* + * void sa1100_setup( int arch_id ); + * + * This is called from decompress_kernel() with the arch_decomp_setup() macro. + */ + ENTRY(sa1100_setup) mov r3, r0 @ keep machine type in r3 @@ -51,7 +58,7 @@ ENTRY(sa1100_setup) @ (taken from "Intel StrongARM SA-1110 Microprocessor Development Board @ User's Guide," p.4-9) - teq r3, #25 @ MACH_TYPE_ASSABET + teq r3, #MACH_TYPE_ASSABET bne skip_SCR ldr r0, GPIO_BASE @@ -80,8 +87,8 @@ ENTRY(sa1100_setup) skip_SCR: @ Initialize UART (if bootloader has not done it yet)... - teq r3, #16 @ MACH_TYPE_BRUTUS - teqne r3, #25 @ MACH_TYPE_ASSABET + teq r3, #MACH_TYPE_BRUTUS + teqne r3, #MACH_TYPE_ASSABET bne skip_uart @ UART3 if Assabet is used with Neponset @@ -92,7 +99,7 @@ skip_SCR: @ At least for Brutus, the UART1 is used through @ the alternate GPIO function... - teq r3, #16 @ MACH_TYPE_BRUTUS + teq r3, #MACH_TYPE_BRUTUS bne uart1 alt_GPIO_uart: ldr r0, GPIO_BASE @@ -126,5 +133,14 @@ uart_init: ldr r1, [r0, #UTSR1] mov r1, #0xff @ flush status reg str r1, [r0, #UTSR0] skip_uart: + + @ Extra specific setup calls + @ The machine type is passed in r0 + mov r0, r3 +#ifdef CONFIG_SA1100_NANOENGINE + teq r0, #32 @ MACH_TYPE_NANOENGINE + beq SYMBOL_NAME(bse_setup) +#endif + out: mov pc, lr diff --git a/arch/arm/config.in b/arch/arm/config.in index 95c94d666..c45998677 100644 --- a/arch/arm/config.in +++ b/arch/arm/config.in @@ -29,6 +29,7 @@ comment 'System Type' choice 'ARM system type' \ "Archimedes/A5000 CONFIG_ARCH_ARCA5K \ + Cirrus-CL-PS7500FE CONFIG_ARCH_CLPS7500 \ Co-EBSA285 CONFIG_ARCH_CO285 \ EBSA-110 CONFIG_ARCH_EBSA110 \ FootBridge CONFIG_ARCH_FOOTBRIDGE \ @@ -62,6 +63,7 @@ if [ "$CONFIG_ARCH_SA1100" = "y" ]; then bool ' Include support for Neponset' CONFIG_ASSABET_NEPONSET fi bool ' Include support for Brutus' CONFIG_SA1100_BRUTUS + bool ' Include support for CerfBoard' CONFIG_SA1100_CERF bool ' Include support for Compaq iPAQ H3600 (Bitsy)' CONFIG_SA1100_BITSY # bool ' Include support for Empeg' CONFIG_SA1100_EMPEG # bool ' Include support for Itsy' CONFIG_SA1100_ITSY @@ -69,9 +71,52 @@ if [ "$CONFIG_ARCH_SA1100" = "y" ]; then # bool ' Include support for PLEB' CONFIG_SA1100_PLEB bool ' Include support for ThinClient' CONFIG_SA1100_THINCLIENT bool ' Include support for GraphicsClient' CONFIG_SA1100_GRAPHICSCLIENT + bool ' Include support for nanoEngine' CONFIG_SA1100_NANOENGINE bool ' Include support for Victor' CONFIG_SA1100_VICTOR # bool ' Include support for Tifon' CONFIG_SA1100_TIFON -# bool ' Include support for XP860' CONFIG_SA1100_XP860 + bool ' Include support for XP860' CONFIG_SA1100_XP860 + + bool ' Load kernel using Angel Debug Monitor' CONFIG_ANGELBOOT + + # Determine if SA1111 support is required + if [ "$CONFIG_ASSABET_NEPONSET" = "y" -o \ + "$CONFIG_SA1100_XP860" = "y" ]; then + define_bool CONFIG_SA1111 y + fi +fi + +# Definitions to make life easier +if [ "$CONFIG_ARCH_ARCA5K" = "y" -o \ + "$CONFIG_ARCH_RPC" = "y" ]; then + define_bool CONFIG_ARCH_ACORN y +else + define_bool CONFIG_ARCH_ACORN n +fi + +# see Documentation/arm/ConfigVars for a description of these +if [ "$CONFIG_ARCH_CO285" = "y" -o \ + "$CONFIG_ARCH_FOOTBRIDGE" = "y" ]; then + define_bool CONFIG_FOOTBRIDGE y +else + define_bool CONFIG_FOOTBRIDGE n +fi +if [ "$CONFIG_ARCH_CATS" = "y" -o \ + "$CONFIG_ARCH_EBSA285_HOST" = "y" -o \ + "$CONFIG_ARCH_NETWINDER" = "y" -o \ + "$CONFIG_ARCH_PERSONAL_SERVER" = "y" ]; then + define_bool CONFIG_FOOTBRIDGE_HOST y +else + define_bool CONFIG_FOOTBRIDGE_HOST n +fi +if [ "$CONFIG_ARCH_CO285" = "y" -o \ + "$CONFIG_ARCH_EBSA285_ADDIN" = "y" ]; then + define_bool CONFIG_FOOTBRIDGE_ADDIN y +else + define_bool CONFIG_FOOTBRIDGE_ADDIN n +fi +if [ "$CONFIG_ARCH_EBSA285_HOST" = "y" -o \ + "$CONFIG_ARCH_EBSA285_ADDIN" = "y" ]; then + define_bool CONFIG_ARCH_EBSA285 y fi # Figure out whether this system uses 26-bit or 32-bit CPUs. @@ -113,38 +158,6 @@ if [ "$CONFIG_ARCH_SA1100" = "y" ]; then fi # Select various configuration options depending on the machine type -if [ "$CONFIG_ARCH_ARCA5K" = "y" -o \ - "$CONFIG_ARCH_RPC" = "y" ]; then - define_bool CONFIG_ARCH_ACORN y -else - define_bool CONFIG_ARCH_ACORN n -fi - -if [ "$CONFIG_ARCH_CO285" = "y" -o \ - "$CONFIG_ARCH_FOOTBRIDGE" = "y" ]; then - define_bool CONFIG_FOOTBRIDGE y -else - define_bool CONFIG_FOOTBRIDGE n -fi -if [ "$CONFIG_ARCH_CATS" = "y" -o \ - "$CONFIG_ARCH_EBSA285_HOST" = "y" -o \ - "$CONFIG_ARCH_NETWINDER" = "y" -o \ - "$CONFIG_ARCH_PERSONAL_SERVER" = "y" ]; then - define_bool CONFIG_FOOTBRIDGE_HOST y -else - define_bool CONFIG_FOOTBRIDGE_HOST n -fi -if [ "$CONFIG_ARCH_CO285" = "y" -o \ - "$CONFIG_ARCH_EBSA285_ADDIN" = "y" ]; then - define_bool CONFIG_FOOTBRIDGE_ADDIN y -else - define_bool CONFIG_FOOTBRIDGE_ADDIN n -fi -if [ "$CONFIG_ARCH_EBSA285_HOST" = "y" -o \ - "$CONFIG_ARCH_EBSA285_ADDIN" = "y" ]; then - define_bool CONFIG_ARCH_EBSA285 y -fi - if [ "$CONFIG_ARCH_SA1100" = "y" ]; then define_bool CONFIG_DISCONTIGMEM y else @@ -167,6 +180,15 @@ else define_bool CONFIG_ISA n define_bool CONFIG_ISA_DMA n fi + +# Do we have a PC-type keyboard in this architecture? +if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" ]; then + define_bool CONFIG_PC_KEYB y + define_bool CONFIG_PC_KEYMAP y +fi +if [ "$CONFIG_SA1100_ASSABET" = "y" ]; then + define_bool CONFIG_PC_KEYMAP y +fi endmenu mainmenu_option next_comment @@ -199,6 +221,7 @@ if [ "$CONFIG_CPU_32" = "y" ]; then fi if [ "$CONFIG_ARCH_EBSA110" = "y" -o \ "$CONFIG_ARCH_SA1100" = "y" -o \ + "$CONFIG_ARCH_CLPS7500" = "y" -o \ "$CONFIG_ARCH_PERSONAL_SERVER" = "y" -o \ "$CONFIG_ARCH_CATS" = "y" ]; then string 'Default kernel command string' CONFIG_CMDLINE "" @@ -301,6 +324,8 @@ fi #source drivers/misc/Config.in +source drivers/media/Config.in + source fs/Config.in if [ "$CONFIG_VT" = "y" ]; then @@ -329,6 +354,7 @@ if [ "$CONFIG_ARCH_ACORN" = "y" -o \ fi source drivers/usb/Config.in +source drivers/input/Config.in mainmenu_option next_comment diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 62c0ca60e..9fa2e8e86 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -5,9 +5,14 @@ # removes any old dependencies. DON'T put your own dependencies here # unless it's something special (ie not a .c file). +USE_STANDARD_AS_RULE := true + HEAD_OBJ = head-$(PROCESSOR).o ENTRY_OBJ = entry-$(PROCESSOR).o +AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional +AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional + O_OBJS_arc = dma-arc.o oldlatches.o O_OBJS_rpc = dma-rpc.o O_OBJS_footbridge = dma-footbridge.o hw-footbridge.o isa.o @@ -54,14 +59,8 @@ MX_OBJS := $(sort $(filter $(export-objs), $(obj-m))) all: kernel.o $(HEAD_OBJ) init_task.o -$(HEAD_OBJ): $(HEAD_OBJ:.o=.S) - $(CC) $(AFLAGS) -DTEXTADDR=$(TEXTADDR) -traditional -c $(HEAD_OBJ:.o=.S) -o $@ - include $(TOPDIR)/Rules.make -.S.o: - $(CC) $(AFLAGS) $(AFLAGS_$@) -c -o $*.o $< - # Spell out some dependencies that `make dep' doesn't spot entry-armv.o: calls.S ../lib/constants.h entry-armo.o: calls.S ../lib/constants.h diff --git a/arch/arm/kernel/arch.c b/arch/arm/kernel/arch.c index 0ce6d9d21..e25331e03 100644 --- a/arch/arm/kernel/arch.c +++ b/arch/arm/kernel/arch.c @@ -15,7 +15,7 @@ #include #include #include -#include +#include #include "arch.h" @@ -219,6 +219,17 @@ static void victor_power_off(void) while (1); } + +static void xp860_power_off(void) +{ + GPDR |= GPIO_GPIO20; + GPSR = GPIO_GPIO20; + mdelay(1000); + GPCR = GPIO_GPIO20; + while(1); +} + + extern void select_sa1100_io_desc(void); #define SET_BANK(__nr,__start,__size) \ mi->bank[__nr].start = (__start), \ @@ -273,6 +284,18 @@ fixup_sa1100(struct machine_desc *desc, struct param_struct *params, setup_initrd( __phys_to_virt(0xd8000000), 3*1024*1024 ); } + else if (machine_is_cerf()) { + // 16Meg Ram. + SET_BANK( 0, 0xc0000000, 8*1024*1024 ); + SET_BANK( 1, 0xc8000000, 8*1024*1024 ); // comment this out for 8MB Cerfs + mi->nr_banks = 2; + + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk(1, 0, 0, 8192); + // Save 2Meg for RAMDisk + setup_initrd(0xc0500000, 3*1024*1024); + } + else if (machine_is_empeg()) { SET_BANK( 0, 0xc0000000, 4*1024*1024 ); SET_BANK( 1, 0xc8000000, 4*1024*1024 ); @@ -309,6 +332,18 @@ fixup_sa1100(struct machine_desc *desc, struct param_struct *params, setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 ); } + else if (machine_is_nanoengine()) { + SET_BANK( 0, 0xc0000000, 32*1024*1024 ); + mi->nr_banks = 1; + + ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); + setup_ramdisk( 1, 0, 0, 8192 ); + setup_initrd( __phys_to_virt(0xc0800000), 4*1024*1024 ); + + /* Get command line parameters passed from the loader (if any) */ + if( *((char*)0xc0000100) ) + *cmdline = ((char *)0xc0000100); + } else if (machine_is_tifon()) { SET_BANK( 0, 0xc0000000, 16*1024*1024 ); SET_BANK( 1, 0xc8000000, 16*1024*1024 ); @@ -335,6 +370,12 @@ fixup_sa1100(struct machine_desc *desc, struct param_struct *params, pm_power_off = victor_power_off; } + else if (machine_is_xp860()) { + SET_BANK( 0, 0xc0000000, 32*1024*1024 ); + mi->nr_banks = 1; + + pm_power_off = xp860_power_off; + } } #ifdef CONFIG_SA1100_ASSABET @@ -356,6 +397,13 @@ MACHINE_START(BRUTUS, "Intel Brutus (SA1100 eval board)") FIXUP(fixup_sa1100) MACHINE_END #endif +#ifdef CONFIG_SA1100_CERF +MACHINE_START(CERF, "Intrinsyc CerfBoard") + MAINTAINER("Pieter Truter") + BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) + FIXUP(fixup_sa1100) +MACHINE_END +#endif #ifdef CONFIG_SA1100_EMPEG MACHINE_START(EMPEG, "empeg MP3 Car Audio Player") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) @@ -381,6 +429,12 @@ MACHINE_START(LART, "LART") FIXUP(fixup_sa1100) MACHINE_END #endif +#ifdef CONFIG_SA1100_NANOENGINE +MACHINE_START(NANOENGINE, "BSE nanoEngine") + BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) + FIXUP(fixup_sa1100) +MACHINE_END +#endif #ifdef CONFIG_SA1100_PLEB MACHINE_START(PLEB, "PLEB") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index fc14d6c45..8dafc4db9 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -23,6 +23,7 @@ #include #include #include +#include extern void dump_thread(struct pt_regs *, struct user *); extern int dump_fpu(struct pt_regs *, struct user_fp_struct *); @@ -187,10 +188,6 @@ EXPORT_SYMBOL(__arch_copy_from_user); EXPORT_SYMBOL(__arch_copy_to_user); EXPORT_SYMBOL(__arch_clear_user); EXPORT_SYMBOL(__arch_strnlen_user); -#elif defined(CONFIG_CPU_26) -EXPORT_SYMBOL(uaccess_kernel); -EXPORT_SYMBOL(uaccess_user); -#endif /* consistent area handling */ EXPORT_SYMBOL(pci_alloc_consistent); @@ -198,6 +195,11 @@ EXPORT_SYMBOL(consistent_alloc); EXPORT_SYMBOL(consistent_free); EXPORT_SYMBOL(consistent_sync); +#elif defined(CONFIG_CPU_26) +EXPORT_SYMBOL(uaccess_kernel); +EXPORT_SYMBOL(uaccess_user); +#endif + /* gcc lib functions */ EXPORT_SYMBOL_NOVERS(__gcc_bcmp); EXPORT_SYMBOL_NOVERS(__ashldi3); diff --git a/arch/arm/kernel/bios32.c b/arch/arm/kernel/bios32.c index b2c644198..0b519e9c3 100644 --- a/arch/arm/kernel/bios32.c +++ b/arch/arm/kernel/bios32.c @@ -11,7 +11,7 @@ #include #include -#include +#include #include "bios32.h" @@ -198,20 +198,35 @@ void __init pcibios_update_resource(struct pci_dev *dev, struct resource *root, struct resource *res, int resource) { - unsigned long where, size; - u32 reg; + u32 val, check; + int reg; if (debug_pci) printk("PCI: Assigning %3s %08lx to %s\n", res->flags & IORESOURCE_IO ? "IO" : "MEM", res->start, dev->name); - where = PCI_BASE_ADDRESS_0 + resource * 4; - size = res->end - res->start; - - pci_read_config_dword(dev, where, ®); - reg = (reg & size) | (((u32)(res->start - root->start)) & ~size); - pci_write_config_dword(dev, where, reg); + val = res->start | (res->flags & PCI_REGION_FLAG_MASK); + if (resource < 6) { + reg = PCI_BASE_ADDRESS_0 + 4*resource; + } else if (resource == PCI_ROM_RESOURCE) { + res->flags |= PCI_ROM_ADDRESS_ENABLE; + val |= PCI_ROM_ADDRESS_ENABLE; + reg = dev->rom_base_reg; + } else { + /* Somebody might have asked allocation of a + * non-standard resource. + */ + return; + } + pci_write_config_dword(dev, reg, val); + pci_read_config_dword(dev, reg, &check); + if ((val ^ check) & ((val & PCI_BASE_ADDRESS_SPACE_IO) ? + PCI_BASE_ADDRESS_IO_MASK : PCI_BASE_ADDRESS_MEM_MASK)) { + printk(KERN_ERR "PCI: Error while updating region " + "%s/%d (%08x != %08x)\n", dev->slot_name, + resource, val, check); + } } void __init pcibios_update_irq(struct pci_dev *dev, int irq) diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S index 0db6d0fde..eee31eeae 100644 --- a/arch/arm/kernel/calls.S +++ b/arch/arm/kernel/calls.S @@ -226,8 +226,9 @@ .long SYMBOL_NAME(sys_setgid) /* 215 */ .long SYMBOL_NAME(sys_setfsuid) .long SYMBOL_NAME(sys_setfsgid) + .long SYMBOL_NAME(sys_getdents64) - .rept NR_syscalls-216 + .rept NR_syscalls-217 .long SYMBOL_NAME(sys_ni_syscall) .endr #endif diff --git a/arch/arm/kernel/debug-armv.S b/arch/arm/kernel/debug-armv.S index da81b3b05..e0b916438 100644 --- a/arch/arm/kernel/debug-armv.S +++ b/arch/arm/kernel/debug-armv.S @@ -162,12 +162,14 @@ #elif defined(CONFIG_ARCH_L7200) - .macro addruart,rx + .equ io_virt, IO_BASE + .equ io_phys, IO_START + .macro addruart,rx mrc p15, 0, \rx, c1, c0 tst \rx, #1 @ MMU enabled? - moveq \rx, #0x80000000 @ physical base address - movne \rx, #0xd0000000 @ virtual address + moveq \rx, #io_phys @ physical base address + movne \rx, #io_virt @ virtual address add \rx, \rx, #0x00044000 @ Ser1 @ add \rx, \rx, #0x00045000 @ Ser2 .endm diff --git a/arch/arm/kernel/dec21285.c b/arch/arm/kernel/dec21285.c index 7fb43c68a..3238b3a3c 100644 --- a/arch/arm/kernel/dec21285.c +++ b/arch/arm/kernel/dec21285.c @@ -274,7 +274,7 @@ void __init dc21285_init(void) cfn_mode = __footbridge_cfn_mode(); - printk(KERN_INFO "PCI: DC21285 footbridge, revision %02lX in " + printk(KERN_INFO "PCI: DC21285 footbridge, revision %02lX, in " "%s mode\n", *CSR_CLASSREV & 0xff, cfn_mode ? "central function" : "addin"); diff --git a/arch/arm/kernel/dma-arc.c b/arch/arm/kernel/dma-arc.c index 5a2f93b67..25fbcccd8 100644 --- a/arch/arm/kernel/dma-arc.c +++ b/arch/arm/kernel/dma-arc.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "dma.h" diff --git a/arch/arm/kernel/dma-rpc.c b/arch/arm/kernel/dma-rpc.c index 35e3c35a3..c7eecfe42 100644 --- a/arch/arm/kernel/dma-rpc.c +++ b/arch/arm/kernel/dma-rpc.c @@ -315,7 +315,7 @@ static struct dma_ops floppy_dma_ops = { /* * This is virtual DMA - we don't need anything here. */ -static int sound_enable_disable_dma(dmach_t channel, dma_t *dma) +static void sound_enable_disable_dma(dmach_t channel, dma_t *dma) { } diff --git a/arch/arm/kernel/dma.c b/arch/arm/kernel/dma.c index 7ed4c28ca..6fe844db4 100644 --- a/arch/arm/kernel/dma.c +++ b/arch/arm/kernel/dma.c @@ -248,24 +248,23 @@ int request_dma(dmach_t channel, const char *device_id) return -EINVAL; } -static int no_dma(void) +int get_dma_residue(dmach_t channel) { return 0; } #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_page, no_dma); -GLOBAL_ALIAS(set_dma_count, no_dma); -GLOBAL_ALIAS(set_dma_addr, no_dma); -GLOBAL_ALIAS(set_dma_sg, no_dma); -GLOBAL_ALIAS(set_dma_speed, no_dma); -GLOBAL_ALIAS(init_dma, no_dma); +GLOBAL_ALIAS(disable_dma, get_dma_residue); +GLOBAL_ALIAS(enable_dma, get_dma_residue); +GLOBAL_ALIAS(free_dma, get_dma_residue); +GLOBAL_ALIAS(get_dma_list, get_dma_residue); +GLOBAL_ALIAS(set_dma_mode, get_dma_residue); +GLOBAL_ALIAS(set_dma_page, get_dma_residue); +GLOBAL_ALIAS(set_dma_count, get_dma_residue); +GLOBAL_ALIAS(set_dma_addr, get_dma_residue); +GLOBAL_ALIAS(set_dma_sg, get_dma_residue); +GLOBAL_ALIAS(set_dma_speed, get_dma_residue); +GLOBAL_ALIAS(init_dma, get_dma_residue); #endif diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index 5acfd9f24..6d9b425ea 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c @@ -265,8 +265,7 @@ static int exec_mmap(void) * Set up the expansion card * daemon's environment. */ -static void -ecard_init_task(void) +static void ecard_init_task(int force) { /* We want to set up the page tables for the following mapping: * Virtual Physical @@ -282,7 +281,8 @@ ecard_init_task(void) pgd_t *src_pgd, *dst_pgd; unsigned int dst_addr = IO_START; - exec_mmap(); + if (!force) + exec_mmap(); src_pgd = pgd_offset(current->mm, IO_BASE); dst_pgd = pgd_offset(current->mm, dst_addr); @@ -309,21 +309,24 @@ ecard_init_task(void) static int ecard_task(void * unused) { - current->session = 1; - current->pgrp = 1; + struct task_struct *tsk = current; + + tsk->session = 1; + tsk->pgrp = 1; /* * We don't want /any/ signals, not even SIGKILL */ - sigfillset(¤t->blocked); - sigemptyset(¤t->signal); + sigfillset(&tsk->blocked); + sigemptyset(&tsk->signal); + recalc_sigpending(tsk); - strcpy(current->comm, "kecardd"); + strcpy(tsk->comm, "kecardd"); /* * Set up the environment */ - ecard_init_task(); + ecard_init_task(0); while (1) { struct ecard_request *req; @@ -332,7 +335,7 @@ ecard_task(void * unused) req = xchg(&ecard_req, NULL); if (req == NULL) { - sigemptyset(¤t->signal); + sigemptyset(&tsk->signal); interruptible_sleep_on(&ecard_wait); } } while (req == NULL); @@ -368,7 +371,7 @@ ecard_call(struct ecard_request *req) */ if ((current == &init_task || in_interrupt()) && req->req == req_reset && req->ec == NULL) { - ecard_init_task(); + ecard_init_task(1); ecard_task_reset(req); } else { if (ecard_pid <= 0) diff --git a/arch/arm/kernel/entry-armo.S b/arch/arm/kernel/entry-armo.S index d6fa94867..ab0f4e69e 100644 --- a/arch/arm/kernel/entry-armo.S +++ b/arch/arm/kernel/entry-armo.S @@ -38,17 +38,6 @@ .text -@ Offsets into task structure -@ --------------------------- -@ -#define STATE 0 -#define COUNTER 4 -#define PRIORITY 8 -#define FLAGS 12 -#define SIGPENDING 16 - -#define PF_TRACESYS 0x20 - @ Bad Abort numbers @ ----------------- @ @@ -58,12 +47,6 @@ #define BAD_IRQ 3 #define BAD_UNDEFINSTR 4 -@ OS version number used in SWIs -@ RISC OS is 0 -@ RISC iX is 8 -@ -#define OS_NUMBER 9 - @ @ Stack format (ensured by USER_* and SVC_*) @ @@ -456,6 +439,7 @@ vector_IRQ: ldr r13, .LCirq @ I will leave this one in just in case... orr lr, lr, #0x08000003 @ Force SVC bne do_IRQ mov r4, #0 + get_current_task r5 b ret_with_reschedule irq_prio_table diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 5d4f216b6..002c39933 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -32,8 +32,6 @@ .text -#define PT_TRACESYS 0x00000002 - @ Bad Abort numbers @ ----------------- @ @@ -43,12 +41,6 @@ #define BAD_IRQ 3 #define BAD_UNDEFINSTR 4 -@ OS version number used in SWIs -@ RISC OS is 0 -@ RISC iX is 8 -@ -#define OS_NUMBER 9 - @ @ Stack format (ensured by USER_* and SVC_*) @ @@ -426,12 +418,15 @@ ENTRY(soft_irq_mask) .endm #elif defined(CONFIG_ARCH_L7200) -/* Don't use fast interrupts */ + + .equ irq_base_addr, IO_BASE_2 + .macro disable_fiq .endm .macro get_irqnr_and_base, irqnr, irqstat, base - ldr r4, =0xe0001000 @ Virt addr status reg + mov r4, #irq_base_addr @ Virt addr IRQ regs + add r4, r4, #0x00001000 @ Status reg ldr \irqstat, [r4] @ get interrupts mov \irqnr, #0 1001: tst \irqstat, #1 @@ -727,6 +722,7 @@ __irq_usr: sub sp, sp, #S_FRAME_SIZE @ bne do_IRQ mov r4, #0 + get_current_task r5 b ret_with_reschedule .align 5 diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index c260b8e19..b22720cd5 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -1,4 +1,13 @@ #include + +#define PT_TRACESYS 0x00000002 + +@ OS version number used in SWIs +@ RISC OS is 0 +@ RISC iX is 8 +@ +#define OS_NUMBER 9 + /*============================================================================ * All exits to user mode from the kernel go through this code. */ @@ -22,25 +31,23 @@ slow_syscall_return: add sp, sp, #S_OFF ret_from_sys_call: @ external entry get_softirq r0 + get_current_task r5 ldmia r0, {r0, r1} @ softirq_active, softirq_mask mov r4, #1 @ flag this as being syscall return tst r0, r1 blne SYMBOL_NAME(do_softirq) -ret_with_reschedule: @ external entry (__irq_usr) - get_current_task r5 +ret_with_reschedule: @ external entry (r5 must be set) (__irq_usr) ldr r0, [r5, #TSK_NEED_RESCHED] ldr r1, [r5, #TSK_SIGPENDING] teq r0, #0 bne ret_reschedule teq r1, #0 @ check for signals - bne ret_signal - + blne ret_signal ret_from_all: restore_user_regs @ internal ret_signal: mov r1, sp @ internal - adrsvc al, lr, ret_from_all mov r2, r4 - b SYMBOL_NAME(do_signal) + b SYMBOL_NAME(do_signal) @ note the bl above sets lr ret_reschedule: adrsvc al, lr, ret_with_reschedule @ internal b SYMBOL_NAME(schedule) @@ -48,12 +55,13 @@ ret_reschedule: adrsvc al, lr, ret_with_reschedule @ internal .globl ret_from_exception ret_from_exception: @ external entry get_softirq r0 + get_current_task r5 ldmia r0, {r0, r1} @ softirq_active, softirq_mask mov r4, #0 tst r0, r1 + ldr r6, [sp, #S_PSR] blne SYMBOL_NAME(do_softirq) - ldr r0, [sp, #S_PSR] - tst r0, #3 @ returning to user mode? + tst r6, #3 @ returning to user mode? beq ret_with_reschedule b ret_from_all diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index 6597de184..b74d7550f 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c @@ -83,8 +83,11 @@ int fiq_def_op(void *ref, int relinquish) return 0; } -static struct fiq_handler default_owner = - { NULL, "default", fiq_def_op, NULL }; +static struct fiq_handler default_owner = { + name: "default", + fiq_op: fiq_def_op, +}; + static struct fiq_handler *current_fiq = &default_owner; int get_fiq_list(char *buf) diff --git a/arch/arm/kernel/head-armo.S b/arch/arm/kernel/head-armo.S index df5b02ae8..f0360a3d9 100644 --- a/arch/arm/kernel/head-armo.S +++ b/arch/arm/kernel/head-armo.S @@ -1,11 +1,13 @@ /* * linux/arch/arm/kernel/head-armo.S * - * Copyright (C) 1994, 1995, 1996, 1997 Russell King + * Copyright (C) 1994-2000 Russell King * * 26-bit kernel startup code */ +#include #include +#include .globl SYMBOL_NAME(swapper_pg_dir) .equ SYMBOL_NAME(swapper_pg_dir), 0x0207d000 @@ -17,46 +19,69 @@ ENTRY(stext) ENTRY(_stext) __entry: cmp pc, #0x02000000 - ldrlt pc, LC1 @ if 0x01800000, call at 0x02080000 + ldrlt pc, LC0 @ if 0x01800000, call at 0x02080000 teq r0, #0 @ Check for old calling method - blne Loldparams @ Move page if old - adr r5, LC0 - ldmia r5, {r5, r6, sl, sp} @ Setup stack - mov r4, #0 -1: cmp r5, sl @ Clear BSS - strcc r4, [r5], #4 + blne oldparams @ Move page if old + adr r0, LC0 + ldmib r0, {r2-r5, sp} @ Setup stack + mov r0, #0 +1: cmp r2, r3 @ Clear BSS + strcc r0, [r2], #4 bcc 1b - mov r0, #0xea000000 @ Point undef instr to continuation - adr r5, Lcontinue - 12 - orr r5, r0, r5, lsr #2 - str r5, [r4, #4] - mov r2, r4 - ldr r5, Larm2_id - swp r0, r0, [r2] @ check for swp (ARM2 can't) - ldr r5, Larm250_id - mrc 15, 0, r0, c0, c0 @ check for CP#15 (ARM250 can't) - mov r5, r0 @ Use processor ID if we do have CP#15 -Lcontinue: str r5, [r6] - mov r5, #0xeb000000 @ Point undef instr vector to itself - sub r5, r5, #2 - str r5, [r4, #4] + + bl detect_proc_type + str r0, [r4] + bl detect_arch_type + str r0, [r5] + mov fp, #0 b SYMBOL_NAME(start_kernel) -LC1: .word SYMBOL_NAME(_stext) -LC0: .word SYMBOL_NAME(__bss_start) - .word SYMBOL_NAME(processor_id) - .word SYMBOL_NAME(_end) - .word SYMBOL_NAME(init_task_union)+8192 -Larm2_id: .long 0x41560200 -Larm250_id: .long 0x41560250 +LC0: .word SYMBOL_NAME(_stext) + .word SYMBOL_NAME(__bss_start) @ r2 + .word SYMBOL_NAME(_end) @ r3 + .word SYMBOL_NAME(processor_id) @ r4 + .word SYMBOL_NAME(__machine_arch_type) @ r5 + .word SYMBOL_NAME(init_task_union)+8192 @ sp +arm2_id: .long 0x41560200 +arm250_id: .long 0x41560250 .align -Loldparams: mov r4, #0x02000000 +oldparams: mov r4, #0x02000000 add r3, r4, #0x00080000 add r4, r4, #0x0007c000 1: ldmia r0!, {r5 - r12} stmia r4!, {r5 - r12} cmp r4, r3 blt 1b - movs pc, lr + mov pc, lr + +/* + * We need some way to automatically detect the difference between + * these two machines. Unfortunately, it is not possible to detect + * the presence of the SuperIO chip, because that will hang the old + * Archimedes machines solid. + */ +/* DAG: Outdated, these have been combined !!!!!!! */ +detect_arch_type: +#if defined(CONFIG_ARCH_ARC) + mov r0, #MACH_TYPE_ARCHIMEDES +#elif defined(CONFIG_ARCH_A5K) + mov r0, #MACH_TYPE_A5K +#endif + mov pc, lr + +detect_proc_type: + mov r2, #0xea000000 @ Point undef instr to continuation + adr r0, continue - 12 + orr r0, r2, r0, lsr #2 + mov r1, #0 + str r0, [r1, #4] + ldr r0, arm2_id + swp r2, r2, [r1] @ check for swp (ARM2 can't) + ldr r0, arm250_id + mrc 15, 0, r0, c0, c0 @ check for CP#15 (ARM250 can't) +continue: mov r2, #0xeb000000 @ Make undef vector loop + sub r2, r2, #2 + str r2, [r1, #4] + mov pc, lr diff --git a/arch/arm/kernel/head-armv.S b/arch/arm/kernel/head-armv.S index 38bfc8760..e253c7efa 100644 --- a/arch/arm/kernel/head-armv.S +++ b/arch/arm/kernel/head-armv.S @@ -19,6 +19,7 @@ #endif #define SWAPPER_PGDIR_OFFSET 0x4000 +#define K(a,b,c) ((a) << 24 | (b) << 12 | (c)) .globl SYMBOL_NAME(swapper_pg_dir) .equ SYMBOL_NAME(swapper_pg_dir), TEXTADDR - 0x8000 + SWAPPER_PGDIR_OFFSET @@ -27,7 +28,28 @@ .type stext, #function ENTRY(stext) ENTRY(_stext) - +/* + * Entry point. The general rules are: + * should be called with r0 == 0 + * r1 contains the unique architecture number + * with MMU is off, I-cache may be on or off, D-cache should be off. + * See linux/arch/arm/kernel/arch.c and linux/include/asm-arm/system.h + * for the complete list of numbers for r1. If you require a new number, + * please follow the instructions given towards the end of + * linux/Documentation/arm/README. + */ + mov r12, r0 +/* + * NOTE! Any code which is placed here should be done for one of + * the following reasons: + * + * 1. Compatability with old production boot firmware (ie, users + * actually have and are booting the kernel with the old firmware) + * and therefore will be eventually removed. + * 2. Cover the case when there is no boot firmware. This is not + * ideal, but in this case, it should ONLY set r0 and r1 to the + * appropriate value. + */ #ifdef CONFIG_ARCH_NETWINDER /* * Compatability cruft for old NetWinder NeTTroms. This @@ -63,28 +85,18 @@ ENTRY(_stext) mov r5, #0 movne pc, r0 - mov r0, #0 @ catch old NeTTroms mov r1, #5 @ (will go in 2.5) + mov r12, #2 << 24 @ scheduled for removal in 2.5.xx + orr r12, r12, #5 << 12 #endif #ifdef CONFIG_ARCH_L7200 /* * FIXME - No bootloader, so manually set 'r1' with our architecture number. */ - mov r0, #0 mov r1, #19 #endif -/* - * Entry point. Entry *must* be called with r0 == 0, with the MMU off. - * r1 contains the unique architecture number. See - * linux/arch/arm/kernel/arch.c and linux/include/asm-arm/system.h for - * the complete list. If you require a new number, please follow the - * instructions given towards the end of Documentation/arm/README. - */ -__entry: teq r0, #0 @ wrong register vals? - movne r0, #'i' @ yes, error 'i' - bne __error - bl __lookup_processor_type +__entry: bl __lookup_processor_type teq r10, #0 @ invalid processor? moveq r0, #'p' @ yes, error 'p' beq __error @@ -98,6 +110,7 @@ __entry: teq r0, #0 @ wrong register vals? @ (return control reg) __switch_data: .long __mmap_switched + .long SYMBOL_NAME(compat) .long SYMBOL_NAME(__bss_start) .long SYMBOL_NAME(_end) .long SYMBOL_NAME(processor_id) @@ -123,8 +136,9 @@ __ret: ldr lr, __switch_data .align 5 __mmap_switched: adr r3, __switch_data + 4 - ldmia r3, {r4, r5, r6, r7, r8, sp} @ r4 = __bss_start + ldmia r3, {r2, r4, r5, r6, r7, r8, sp}@ r2 = compat @ sp = stack pointer + str r12, [r2] mov fp, #0 @ Clear BSS 1: cmp r4, r5 diff --git a/arch/arm/kernel/hw-footbridge.c b/arch/arm/kernel/hw-footbridge.c index b56b944e7..41ff450a5 100644 --- a/arch/arm/kernel/hw-footbridge.c +++ b/arch/arm/kernel/hw-footbridge.c @@ -15,7 +15,7 @@ #include #include -#include +#include #define IRDA_IO_BASE 0x180 #define GP1_IO_BASE 0x338 diff --git a/arch/arm/kernel/hw-sa1100.c b/arch/arm/kernel/hw-sa1100.c index 27786cdd2..5acfab1e2 100644 --- a/arch/arm/kernel/hw-sa1100.c +++ b/arch/arm/kernel/hw-sa1100.c @@ -17,7 +17,7 @@ #include #include - +#include /* * SA1100 GPIO edge detection for IRQs: @@ -130,12 +130,40 @@ void __init sa1111_init(void){ * any other SA-1111 functional blocks must be enabled separately * using the SKPCR. */ + + { + /* + * SA1111 DMA bus master setup + */ + int cas; + + /* SA1111 side */ + switch ( (MDCNFG>>12) & 0x03 ) { + case 0x02: + cas = 0; break; + case 0x03: + cas = 1; break; + default: + cas = 1; break; + } + SMCR = 1 /* 1: memory is SDRAM */ + | ( 1 << 1 ) /* 1:MBGNT is enable */ + | ( ((MDCNFG >> 4) & 0x07) << 2 ) /* row address lines */ + | ( cas << 5 ); /* CAS latency */ + + /* SA1110 side */ + GPDR |= 1<<21; + GPDR &= ~(1<<22); + GAFR |= ( (1<<21) | (1<<22) ); + + TUCR |= (1<<10); + } } #endif -static void __init hw_sa1100_init(void) +static int __init hw_sa1100_init(void) { if( machine_is_assabet() ){ if(machine_has_neponset()){ @@ -147,7 +175,10 @@ static void __init hw_sa1100_init(void) "hasn't been configured in the kernel\n" ); #endif } + } else if (machine_is_xp860()) { + sa1111_init(); } + return 0; } module_init(hw_sa1100_init); diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 8af0c3b3f..69b72624d 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -31,18 +31,12 @@ #include #include -#ifndef cliIF -#define cliIF() -#endif - /* - * Maximum IRQ count. Currently, this is arbitary. - * However, it should not be set too low to prevent - * false triggering. Conversely, if it is set too - * high, then you could miss a stuck IRQ. + * Maximum IRQ count. Currently, this is arbitary. However, it should + * not be set too low to prevent false triggering. Conversely, if it + * is set too high, then you could miss a stuck IRQ. * - * Maybe we ought to set a timer and re-enable the - * IRQ at a later time? + * Maybe we ought to set a timer and re-enable the IRQ at a later time? */ #define MAX_IRQ_CNT 100000 @@ -94,7 +88,6 @@ void disable_irq(unsigned int irq) unsigned long flags; spin_lock_irqsave(&irq_controller_lock, flags); - cliIF(); irq_desc[irq].enabled = 0; irq_desc[irq].mask(irq); spin_unlock_irqrestore(&irq_controller_lock, flags); @@ -105,7 +98,6 @@ void enable_irq(unsigned int irq) unsigned long flags; spin_lock_irqsave(&irq_controller_lock, flags); - cliIF(); irq_desc[irq].probing = 0; irq_desc[irq].triggered = 0; irq_desc[irq].enabled = 1; diff --git a/arch/arm/kernel/leds-footbridge.c b/arch/arm/kernel/leds-footbridge.c index b309c2ea3..3de4c96f9 100644 --- a/arch/arm/kernel/leds-footbridge.c +++ b/arch/arm/kernel/leds-footbridge.c @@ -25,6 +25,7 @@ #include #include +#include #include #define LED_STATE_ENABLED 1 @@ -35,7 +36,7 @@ static char hw_led_state; static spinlock_t leds_lock = SPIN_LOCK_UNLOCKED; extern spinlock_t gpio_lock; -#ifdef CONFIG_FOOTBRIDGE +#if defined(CONFIG_ARCH_EBSA285) || defined(CONFIG_ARCH_CO285) static void ebsa285_leds_event(led_event_t evt) { @@ -76,15 +77,20 @@ static void ebsa285_leds_event(led_event_t evt) #ifdef CONFIG_LEDS_CPU case led_idle_start: if (!(led_state & LED_STATE_CLAIMED)) - hw_led_state |= XBUS_LED_RED; + hw_led_state |= XBUS_LED_AMBER; break; case led_idle_end: if (!(led_state & LED_STATE_CLAIMED)) - hw_led_state &= ~XBUS_LED_RED; + hw_led_state &= ~XBUS_LED_AMBER; break; #endif + case led_halted: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state &= ~XBUS_LED_RED; + break; + case led_green_on: if (led_state & LED_STATE_CLAIMED) hw_led_state &= ~XBUS_LED_GREEN; @@ -174,6 +180,11 @@ static void netwinder_leds_event(led_event_t evt) break; #endif + case led_halted: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state |= GPIO_RED_LED; + break; + case led_green_on: if (led_state & LED_STATE_CLAIMED) hw_led_state |= GPIO_GREEN_LED; @@ -229,7 +240,7 @@ EXPORT_SYMBOL(leds_event); static int __init leds_init(void) { -#ifdef CONFIG_FOOTBRIDGE +#if defined(CONFIG_ARCH_EBSA285) || defined(CONFIG_ARCH_CO285) if (machine_is_ebsa285() || machine_is_co285()) leds_event = ebsa285_leds_event; #endif diff --git a/arch/arm/kernel/leds-sa1100.c b/arch/arm/kernel/leds-sa1100.c index f2f0325c3..fc4662c2a 100644 --- a/arch/arm/kernel/leds-sa1100.c +++ b/arch/arm/kernel/leds-sa1100.c @@ -36,6 +36,7 @@ #include #include +#include #include @@ -95,6 +96,9 @@ static void assabet_leds_event(led_event_t evt) break; #endif + case led_halted: + break; + case led_green_on: if (led_state & LED_STATE_CLAIMED) hw_led_state &= ~BCR_LED_GREEN; @@ -302,6 +306,100 @@ static void lart_leds_event(led_event_t evt) #endif /* CONFIG_SA1100_LART */ +#ifdef CONFIG_SA1100_CERF +#define LED_D0 GPIO_GPIO(0) +#define LED_D1 GPIO_GPIO(1) +#define LED_D2 GPIO_GPIO(2) +#define LED_D3 GPIO_GPIO(3) +#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3) + +static void cerf_leds_event(led_event_t evt) +{ + unsigned long flags; + + save_flags_cli(flags); + + switch (evt) { + case led_start: + hw_led_state = LED_MASK; + led_state = LED_STATE_ENABLED; + break; + + case led_stop: + led_state &= ~LED_STATE_ENABLED; + break; + + case led_claim: + led_state |= LED_STATE_CLAIMED; + hw_led_state = LED_MASK; + break; + case led_release: + led_state &= ~LED_STATE_CLAIMED; + hw_led_state = LED_MASK; + break; + +#ifdef CONFIG_LEDS_TIMER + case led_timer: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state ^= LED_D0; + break; +#endif + +#ifdef CONFIG_LEDS_CPU + case led_idle_start: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state &= ~LED_D1; + break; + + case led_idle_end: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state |= LED_D1; + break; +#endif + case led_green_on: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state &= ~LED_D2; + break; + + case led_green_off: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state |= LED_D2; + break; + + case led_amber_on: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state &= ~LED_D3; + break; + + case led_amber_off: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state |= LED_D3; + break; + + case led_red_on: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state &= ~LED_D1; + break; + + case led_red_off: + if (!(led_state & LED_STATE_CLAIMED)) + hw_led_state |= LED_D1; + break; + + default: + break; + } + + if (led_state & LED_STATE_ENABLED) { + GPSR = hw_led_state; + GPCR = hw_led_state ^ LED_MASK; + } + + restore_flags(flags); +} + +#endif /* CONFIG_SA1100_CERF */ + static void dummy_leds_event(led_event_t evt) { } @@ -325,7 +423,13 @@ sa1100_leds_init(void) if (machine_is_lart()) leds_event = lart_leds_event; #endif - +#ifdef CONFIG_SA1100_CERF + if (machine_is_cerf()) + { + //GPDR |= 0x0000000F; + leds_event = cerf_leds_event; + } +#endif leds_event(led_start); return 0; } diff --git a/arch/arm/kernel/oldlatches.c b/arch/arm/kernel/oldlatches.c index 3d6758ff4..91b9e5d62 100644 --- a/arch/arm/kernel/oldlatches.c +++ b/arch/arm/kernel/oldlatches.c @@ -1,14 +1,17 @@ /* Support for the latches on the old Archimedes which control the floppy, * hard disc and printer * - * (c) David Alan Gilbert 1995/1996 + * (c) David Alan Gilbert 1995/1996,2000 */ #include #include #include +#include #include #include +#include +#include static unsigned char latch_a_copy; static unsigned char latch_b_copy; diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 3ef5bc59d..478810936 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -22,6 +22,7 @@ #include #include +#include #include /* @@ -32,7 +33,7 @@ #define IDLE_CLOCK_SLOW 2 #define IDLE_CLOCK_FAST 3 -extern char *processor_modes[]; +extern const char *processor_modes[]; extern void setup_mm_for_reboot(char mode); asmlinkage void ret_from_sys_call(void) __asm__("ret_from_sys_call"); @@ -109,10 +110,12 @@ __setup("reboot=", reboot_setup); void machine_halt(void) { + leds_event(led_halted); } void machine_power_off(void) { + leds_event(led_halted); if (pm_power_off) pm_power_off(); } diff --git a/arch/arm/kernel/semaphore.c b/arch/arm/kernel/semaphore.c index 8118b6a68..d29f8cf1f 100644 --- a/arch/arm/kernel/semaphore.c +++ b/arch/arm/kernel/semaphore.c @@ -7,6 +7,7 @@ * * Modified for ARM by Russell King */ +#include #include #include @@ -53,8 +54,8 @@ void __down(struct semaphore * sem) { struct task_struct *tsk = current; DECLARE_WAITQUEUE(wait, tsk); - tsk->state = TASK_UNINTERRUPTIBLE; - add_wait_queue(&sem->wait, &wait); + tsk->state = TASK_UNINTERRUPTIBLE|TASK_EXCLUSIVE; + add_wait_queue_exclusive(&sem->wait, &wait); spin_lock_irq(&semaphore_lock); sem->sleepers++; @@ -67,28 +68,28 @@ void __down(struct semaphore * sem) */ if (!atomic_add_negative(sleepers - 1, &sem->count)) { sem->sleepers = 0; - wake_up(&sem->wait); break; } sem->sleepers = 1; /* us - see -1 above */ spin_unlock_irq(&semaphore_lock); schedule(); - tsk->state = TASK_UNINTERRUPTIBLE; + tsk->state = TASK_UNINTERRUPTIBLE|TASK_EXCLUSIVE; spin_lock_irq(&semaphore_lock); } spin_unlock_irq(&semaphore_lock); remove_wait_queue(&sem->wait, &wait); tsk->state = TASK_RUNNING; + wake_up(&sem->wait); } int __down_interruptible(struct semaphore * sem) { - int retval; + int retval = 0; struct task_struct *tsk = current; DECLARE_WAITQUEUE(wait, tsk); - tsk->state = TASK_INTERRUPTIBLE; - add_wait_queue(&sem->wait, &wait); + tsk->state = TASK_INTERRUPTIBLE|TASK_EXCLUSIVE; + add_wait_queue_exclusive(&sem->wait, &wait); spin_lock_irq(&semaphore_lock); sem->sleepers ++; @@ -102,12 +103,10 @@ int __down_interruptible(struct semaphore * sem) * it has contention. Just correct the count * and exit. */ - retval = -EINTR; if (signal_pending(current)) { + retval = -EINTR; sem->sleepers = 0; - if (atomic_add_negative(sleepers, &sem->count)) - break; - wake_up(&sem->wait); + atomic_add(sleepers, &sem->count); break; } @@ -118,8 +117,6 @@ int __down_interruptible(struct semaphore * sem) * the lock. */ if (!atomic_add_negative(sleepers - 1, &sem->count)) { - wake_up(&sem->wait); - retval = 0; sem->sleepers = 0; break; } @@ -127,12 +124,13 @@ int __down_interruptible(struct semaphore * sem) spin_unlock_irq(&semaphore_lock); schedule(); - tsk->state = TASK_INTERRUPTIBLE; + tsk->state = TASK_INTERRUPTIBLE|TASK_EXCLUSIVE; spin_lock_irq(&semaphore_lock); } spin_unlock_irq(&semaphore_lock); tsk->state = TASK_RUNNING; remove_wait_queue(&sem->wait, &wait); + wake_up(&sem->wait); return retval; } @@ -147,8 +145,9 @@ int __down_interruptible(struct semaphore * sem) int __down_trylock(struct semaphore * sem) { int sleepers; + unsigned long flags; - spin_lock_irq(&semaphore_lock); + spin_lock_irqsave(&semaphore_lock, flags); sleepers = sem->sleepers + 1; sem->sleepers = 0; @@ -159,7 +158,7 @@ int __down_trylock(struct semaphore * sem) if (!atomic_add_negative(sleepers, &sem->count)) wake_up(&sem->wait); - spin_unlock_irq(&semaphore_lock); + spin_unlock_irqrestore(&semaphore_lock, flags); return 1; } @@ -254,7 +253,8 @@ struct rw_semaphore *down_write_failed(struct rw_semaphore *sem) while (atomic_read(&sem->count) < 0) { set_task_state(tsk, TASK_UNINTERRUPTIBLE | TASK_EXCLUSIVE); if (atomic_read(&sem->count) >= 0) - break; /* we must attempt to aquire or bias the lock */ schedule(); + break; /* we must attempt to aquire or bias the lock */ + schedule(); } remove_wait_queue(&sem->wait, &wait); @@ -293,6 +293,102 @@ struct rw_semaphore *rwsem_wake_writer(struct rw_semaphore *sem) * registers (r0 to r3 and lr), but not ip, as we use it as a return * value in some cases.. */ +#ifdef CONFIG_CPU_26 +asm(" .section .text.lock, \"ax\" + .align 5 + .globl __down_failed +__down_failed: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + bl __down + ldmfd sp!, {r0 - r3, pc}^ + + .align 5 + .globl __down_interruptible_failed +__down_interruptible_failed: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + bl __down_interruptible + mov ip, r0 + ldmfd sp!, {r0 - r3, pc}^ + + .align 5 + .globl __down_trylock_failed +__down_trylock_failed: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + bl __down_trylock + mov ip, r0 + ldmfd sp!, {r0 - r3, pc}^ + + .align 5 + .globl __up_wakeup +__up_wakeup: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + bl __up + ldmfd sp!, {r0 - r3, pc}^ + + .align 5 + .globl __down_read_failed +__down_read_failed: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + bcc 1f +1: bl down_read_failed_biased + ldmfd sp!, {r0 - r3, pc}^ +2: bl down_read_failed + mov r1, pc + orr r2, r1, # + teqp r2, #0 + + ldr r3, [r0] + subs r3, r3, #1 + str r3, [r0] + ldmplfd sp!, {r0 - r3, pc}^ + orrcs r1, r1, #0x20000000 @ Set carry + teqp r1, #0 + bcc 2b + b 1b + + .align 5 + .globl __down_write_failed +__down_write_failed: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + bcc 1f +1: bl down_write_failed_biased + ldmfd sp!, {r0 - r3, pc}^ +2: bl down_write_failed + mov r1, pc + orr r2, r1, #128 + teqp r2, #0 + + ldr r3, [r0] + subs r3, r3, #"RW_LOCK_BIAS_STR" + str r3, [r0] + ldmeqfd sp!, {r0 - r3, pc}^ + orrcs r1, r1, #0x20000000 @ Set carry + teqp r1, #0 + bcc 2b + b 1b + + .align 5 + .globl __rwsem_wake +__rwsem_wake: + stmfd sp!, {r0 - r3, lr} + mov r0, ip + beq 1f + bl rwsem_wake_readers + ldmfd sp!, {r0 - r3, pc}^ +1: bl rwsem_wake_writer + ldmfd sp!, {r0 - r3, pc}^ + + .previous + "); + +#else +/* 32 bit version */ asm(" .section .text.lock, \"ax\" .align 5 .globl __down_failed @@ -382,3 +478,4 @@ __rwsem_wake: .previous "); +#endif diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index c6010476a..c20ffab21 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -19,7 +19,7 @@ #include #include #include -#include +#include #include "arch.h" @@ -40,6 +40,7 @@ extern int root_mountflags; extern int _stext, _text, _etext, _edata, _end; unsigned int processor_id; +unsigned int compat; unsigned int __machine_arch_type; unsigned int system_rev; unsigned int system_serial_low; @@ -161,6 +162,11 @@ static struct machine_desc * __init setup_architecture(unsigned int nr) } printk("Architecture: %s\n", list->name); + if (compat) + printk(KERN_WARNING "Using compatability code " + "scheduled for removal in v%d.%d.%d\n", + compat >> 24, (compat >> 12) & 0x3ff, + compat & 0x3ff); return list; } @@ -305,12 +311,6 @@ void __init setup_arch(char **cmdline_p) memset(&meminfo, 0, sizeof(meminfo)); -#if defined(CONFIG_ARCH_ARC) - __machine_arch_type = MACH_TYPE_ARCHIMEDES; -#elif defined(CONFIG_ARCH_A5K) - __machine_arch_type = MACH_TYPE_A5K; -#endif - setup_processor(); ROOT_DEV = MKDEV(0, 255); diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 4d489bcf3..5c2e240b7 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -35,37 +35,38 @@ asmlinkage int do_signal(sigset_t *oldset, struct pt_regs * regs, int syscall); int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from) { + int err = -EFAULT;; + if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t))) - return -EFAULT; + goto out; + if (from->si_code < 0) return __copy_to_user(to, from, sizeof(siginfo_t)); - else { - int err; - - /* If you change siginfo_t structure, please be sure - this code is fixed accordingly. - It should never copy any pad contained in the structure - to avoid security leaks, but must copy the generic - 3 ints plus the relevant union member. */ - err = __put_user(from->si_signo, &to->si_signo); - err |= __put_user(from->si_errno, &to->si_errno); - err |= __put_user((short)from->si_code, &to->si_code); - /* First 32bits of unions are always present. */ - err |= __put_user(from->si_pid, &to->si_pid); - switch (from->si_code >> 16) { - case __SI_FAULT >> 16: - break; - case __SI_CHLD >> 16: - err |= __put_user(from->si_utime, &to->si_utime); - err |= __put_user(from->si_stime, &to->si_stime); - err |= __put_user(from->si_status, &to->si_status); - default: - err |= __put_user(from->si_uid, &to->si_uid); - break; - /* case __SI_RT: This is not generated by the kernel as of now. */ - } - return err; + + /* If you change siginfo_t structure, please be sure + this code is fixed accordingly. + It should never copy any pad contained in the structure + to avoid security leaks, but must copy the generic + 3 ints plus the relevant union member. */ + err = __put_user(from->si_signo, &to->si_signo); + err |= __put_user(from->si_errno, &to->si_errno); + err |= __put_user((short)from->si_code, &to->si_code); + /* First 32bits of unions are always present. */ + err |= __put_user(from->si_pid, &to->si_pid); + switch (from->si_code >> 16) { + case __SI_FAULT >> 16: + break; + case __SI_CHLD >> 16: + err |= __put_user(from->si_utime, &to->si_utime); + err |= __put_user(from->si_stime, &to->si_stime); + err |= __put_user(from->si_status, &to->si_status); + default: + err |= __put_user(from->si_uid, &to->si_uid); + break; + /* case __SI_RT: This is not generated by the kernel as of now. */ } +out: + return err; } /* @@ -175,24 +176,24 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext *sc) { int err = 0; - err |= __get_user(regs->ARM_r0, &sc->arm_r0); - err |= __get_user(regs->ARM_r1, &sc->arm_r1); - err |= __get_user(regs->ARM_r2, &sc->arm_r2); - err |= __get_user(regs->ARM_r3, &sc->arm_r3); - err |= __get_user(regs->ARM_r4, &sc->arm_r4); - err |= __get_user(regs->ARM_r5, &sc->arm_r5); - err |= __get_user(regs->ARM_r6, &sc->arm_r6); - err |= __get_user(regs->ARM_r7, &sc->arm_r7); - err |= __get_user(regs->ARM_r8, &sc->arm_r8); - err |= __get_user(regs->ARM_r9, &sc->arm_r9); - err |= __get_user(regs->ARM_r10, &sc->arm_r10); - err |= __get_user(regs->ARM_fp, &sc->arm_fp); - err |= __get_user(regs->ARM_ip, &sc->arm_ip); - err |= __get_user(regs->ARM_sp, &sc->arm_sp); - err |= __get_user(regs->ARM_lr, &sc->arm_lr); - err |= __get_user(regs->ARM_pc, &sc->arm_pc); + __get_user_error(regs->ARM_r0, &sc->arm_r0, err); + __get_user_error(regs->ARM_r1, &sc->arm_r1, err); + __get_user_error(regs->ARM_r2, &sc->arm_r2, err); + __get_user_error(regs->ARM_r3, &sc->arm_r3, err); + __get_user_error(regs->ARM_r4, &sc->arm_r4, err); + __get_user_error(regs->ARM_r5, &sc->arm_r5, err); + __get_user_error(regs->ARM_r6, &sc->arm_r6, err); + __get_user_error(regs->ARM_r7, &sc->arm_r7, err); + __get_user_error(regs->ARM_r8, &sc->arm_r8, err); + __get_user_error(regs->ARM_r9, &sc->arm_r9, err); + __get_user_error(regs->ARM_r10, &sc->arm_r10, err); + __get_user_error(regs->ARM_fp, &sc->arm_fp, err); + __get_user_error(regs->ARM_ip, &sc->arm_ip, err); + __get_user_error(regs->ARM_sp, &sc->arm_sp, err); + __get_user_error(regs->ARM_lr, &sc->arm_lr, err); + __get_user_error(regs->ARM_pc, &sc->arm_pc, err); #ifdef CONFIG_CPU_32 - err |= __get_user(regs->ARM_cpsr, &sc->arm_cpsr); + __get_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err); #endif err |= !valid_user_regs(regs); @@ -289,30 +290,30 @@ setup_sigcontext(struct sigcontext *sc, /*struct _fpstate *fpstate,*/ { int err = 0; - err |= __put_user (regs->ARM_r0, &sc->arm_r0); - err |= __put_user (regs->ARM_r1, &sc->arm_r1); - err |= __put_user (regs->ARM_r2, &sc->arm_r2); - err |= __put_user (regs->ARM_r3, &sc->arm_r3); - err |= __put_user (regs->ARM_r4, &sc->arm_r4); - err |= __put_user (regs->ARM_r5, &sc->arm_r5); - err |= __put_user (regs->ARM_r6, &sc->arm_r6); - err |= __put_user (regs->ARM_r7, &sc->arm_r7); - err |= __put_user (regs->ARM_r8, &sc->arm_r8); - err |= __put_user (regs->ARM_r9, &sc->arm_r9); - err |= __put_user (regs->ARM_r10, &sc->arm_r10); - err |= __put_user (regs->ARM_fp, &sc->arm_fp); - err |= __put_user (regs->ARM_ip, &sc->arm_ip); - err |= __put_user (regs->ARM_sp, &sc->arm_sp); - err |= __put_user (regs->ARM_lr, &sc->arm_lr); - err |= __put_user (regs->ARM_pc, &sc->arm_pc); + __put_user_error(regs->ARM_r0, &sc->arm_r0, err); + __put_user_error(regs->ARM_r1, &sc->arm_r1, err); + __put_user_error(regs->ARM_r2, &sc->arm_r2, err); + __put_user_error(regs->ARM_r3, &sc->arm_r3, err); + __put_user_error(regs->ARM_r4, &sc->arm_r4, err); + __put_user_error(regs->ARM_r5, &sc->arm_r5, err); + __put_user_error(regs->ARM_r6, &sc->arm_r6, err); + __put_user_error(regs->ARM_r7, &sc->arm_r7, err); + __put_user_error(regs->ARM_r8, &sc->arm_r8, err); + __put_user_error(regs->ARM_r9, &sc->arm_r9, err); + __put_user_error(regs->ARM_r10, &sc->arm_r10, err); + __put_user_error(regs->ARM_fp, &sc->arm_fp, err); + __put_user_error(regs->ARM_ip, &sc->arm_ip, err); + __put_user_error(regs->ARM_sp, &sc->arm_sp, err); + __put_user_error(regs->ARM_lr, &sc->arm_lr, err); + __put_user_error(regs->ARM_pc, &sc->arm_pc, err); #ifdef CONFIG_CPU_32 - err |= __put_user (regs->ARM_cpsr, &sc->arm_cpsr); + __put_user_error(regs->ARM_cpsr, &sc->arm_cpsr, err); #endif - err |= __put_user (current->thread.trap_no, &sc->trap_no); - err |= __put_user (current->thread.error_code, &sc->error_code); - err |= __put_user (current->thread.address, &sc->fault_address); - err |= __put_user (mask, &sc->oldmask); + __put_user_error(current->thread.trap_no, &sc->trap_no, err); + __put_user_error(current->thread.error_code, &sc->error_code, err); + __put_user_error(current->thread.address, &sc->fault_address, err); + __put_user_error(mask, &sc->oldmask, err); return err; } diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index c76a95736..197107138 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -30,7 +30,7 @@ extern void c_backtrace (unsigned long fp, int pmode); -char *processor_modes[]= +const char *processor_modes[]= { "USER_26", "FIQ_26" , "IRQ_26" , "SVC_26" , "UK4_26" , "UK5_26" , "UK6_26" , "UK7_26" , "UK8_26" , "UK9_26" , "UK10_26", "UK11_26", "UK12_26", "UK13_26", "UK14_26", "UK15_26", "USER_32", "FIQ_32" , "IRQ_32" , "SVC_32" , "UK4_32" , "UK5_32" , "UK6_32" , "ABT_32" , @@ -414,7 +414,7 @@ void __bug(const char *file, int line, void *data) if (data) printk(KERN_CRIT" - extra data = %p", data); printk("\n"); - BUG(); + *(int *)0 = 0; } void __readwrite_bug(const char *fn) diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 991b4a3c8..cfa371d5e 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -4,6 +4,8 @@ # Copyright (C) 1995-1999 Russell King # +USE_STANDARD_AS_RULE := true + L_TARGET := lib.a L_OBJS := changebit.o csumipv6.o csumpartial.o csumpartialcopy.o \ csumpartialcopyuser.o clearbit.o copy_page.o findbit.o \ @@ -36,9 +38,6 @@ L_OBJS += $(L_OBJS_$(MACHINE)) include $(TOPDIR)/Rules.make -.S.o: - $(CC) $(AFLAGS) -traditional -c -o $*.o $< - constants.h: getconsdata.o extractconstants.pl $(PERL) extractconstants.pl $(OBJDUMP) > $@ diff --git a/arch/arm/lib/uaccess.S b/arch/arm/lib/uaccess.S index e95160e38..f2ea3231d 100644 --- a/arch/arm/lib/uaccess.S +++ b/arch/arm/lib/uaccess.S @@ -76,20 +76,20 @@ USER( strt r3, [r0], #4) @ May fault blt .c2u_0rem8lp .c2u_0cpy8lp: ldmia r1!, {r3 - r6} - stmia r0!, {r3 - r6} @ Shouldn't fault + stmia r0!, {r3 - r6} @ Shouldnt fault ldmia r1!, {r3 - r6} - stmia r0!, {r3 - r6} @ Shouldn't fault + stmia r0!, {r3 - r6} @ Shouldnt fault subs ip, ip, #32 bpl .c2u_0cpy8lp .c2u_0rem8lp: cmn ip, #16 ldmgeia r1!, {r3 - r6} - stmgeia r0!, {r3 - r6} @ Shouldn't fault + stmgeia r0!, {r3 - r6} @ Shouldnt fault tst ip, #8 ldmneia r1!, {r3 - r4} - stmneia r0!, {r3 - r4} @ Shouldn't fault + stmneia r0!, {r3 - r4} @ Shouldnt fault tst ip, #4 ldrne r3, [r1], #4 - strnet r3, [r0], #4 @ Shouldn't fault + strnet r3, [r0], #4 @ Shouldnt fault ands ip, ip, #3 beq .c2u_0fupi .c2u_0nowords: teq ip, #0 @@ -141,7 +141,7 @@ USER( strt r3, [r0], #4) @ May fault orr r5, r5, r6, lsl #24 mov r6, r6, lsr #8 orr r6, r6, r7, lsl #24 - stmia r0!, {r3 - r6} @ Shouldn't fault + stmia r0!, {r3 - r6} @ Shouldnt fault subs ip, ip, #16 bpl .c2u_1cpy8lp .c2u_1rem8lp: tst ip, #8 @@ -150,12 +150,12 @@ USER( strt r3, [r0], #4) @ May fault orrne r3, r3, r4, lsl #24 movne r4, r4, lsr #8 orrne r4, r4, r7, lsl #24 - stmneia r0!, {r3 - r4} @ Shouldn't fault + stmneia r0!, {r3 - r4} @ Shouldnt fault tst ip, #4 movne r3, r7, lsr #8 ldrne r7, [r1], #4 orrne r3, r3, r7, lsl #24 - strnet r3, [r0], #4 @ Shouldn't fault + strnet r3, [r0], #4 @ Shouldnt fault ands ip, ip, #3 beq .c2u_1fupi .c2u_1nowords: mov r3, r7, lsr #8 @@ -195,7 +195,7 @@ USER( strt r3, [r0], #4) @ May fault orr r5, r5, r6, lsl #16 mov r6, r6, lsr #16 orr r6, r6, r7, lsl #16 - stmia r0!, {r3 - r6} @ Shouldn't fault + stmia r0!, {r3 - r6} @ Shouldnt fault subs ip, ip, #16 bpl .c2u_2cpy8lp .c2u_2rem8lp: tst ip, #8 @@ -204,12 +204,12 @@ USER( strt r3, [r0], #4) @ May fault orrne r3, r3, r4, lsl #16 movne r4, r4, lsr #16 orrne r4, r4, r7, lsl #16 - stmneia r0!, {r3 - r4} @ Shouldn't fault + stmneia r0!, {r3 - r4} @ Shouldnt fault tst ip, #4 movne r3, r7, lsr #16 ldrne r7, [r1], #4 orrne r3, r3, r7, lsl #16 - strnet r3, [r0], #4 @ Shouldn't fault + strnet r3, [r0], #4 @ Shouldnt fault ands ip, ip, #3 beq .c2u_2fupi .c2u_2nowords: mov r3, r7, lsr #16 @@ -249,7 +249,7 @@ USER( strt r3, [r0], #4) @ May fault orr r5, r5, r6, lsl #8 mov r6, r6, lsr #24 orr r6, r6, r7, lsl #8 - stmia r0!, {r3 - r6} @ Shouldn't fault + stmia r0!, {r3 - r6} @ Shouldnt fault subs ip, ip, #16 bpl .c2u_3cpy8lp .c2u_3rem8lp: tst ip, #8 @@ -258,12 +258,12 @@ USER( strt r3, [r0], #4) @ May fault orrne r3, r3, r4, lsl #8 movne r4, r4, lsr #24 orrne r4, r4, r7, lsl #8 - stmneia r0!, {r3 - r4} @ Shouldn't fault + stmneia r0!, {r3 - r4} @ Shouldnt fault tst ip, #4 movne r3, r7, lsr #24 ldrne r7, [r1], #4 orrne r3, r3, r7, lsl #8 - strnet r3, [r0], #4 @ Shouldn't fault + strnet r3, [r0], #4 @ Shouldnt fault ands ip, ip, #3 beq .c2u_3fupi .c2u_3nowords: mov r3, r7, lsr #24 @@ -333,20 +333,20 @@ USER( ldrt r3, [r1], #4) subs ip, ip, #32 blt .cfu_0rem8lp -.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldn't fault +.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault stmia r0!, {r3 - r6} - ldmia r1!, {r3 - r6} @ Shouldn't fault + ldmia r1!, {r3 - r6} @ Shouldnt fault stmia r0!, {r3 - r6} subs ip, ip, #32 bpl .cfu_0cpy8lp .cfu_0rem8lp: cmn ip, #16 - ldmgeia r1!, {r3 - r6} @ Shouldn't fault + ldmgeia r1!, {r3 - r6} @ Shouldnt fault stmgeia r0!, {r3 - r6} tst ip, #8 - ldmneia r1!, {r3 - r4} @ Shouldn't fault + ldmneia r1!, {r3 - r4} @ Shouldnt fault stmneia r0!, {r3 - r4} tst ip, #4 - ldrnet r3, [r1], #4 @ Shouldn't fault + ldrnet r3, [r1], #4 @ Shouldnt fault strne r3, [r0], #4 ands ip, ip, #3 beq .cfu_0fupi @@ -392,7 +392,7 @@ USER( ldrt r7, [r1], #4) @ May fault blt .cfu_1rem8lp .cfu_1cpy8lp: mov r3, r7, lsr #8 - ldmia r1!, {r4 - r7} @ Shouldn't fault + ldmia r1!, {r4 - r7} @ Shouldnt fault orr r3, r3, r4, lsl #24 mov r4, r4, lsr #8 orr r4, r4, r5, lsl #24 @@ -405,7 +405,7 @@ USER( ldrt r7, [r1], #4) @ May fault bpl .cfu_1cpy8lp .cfu_1rem8lp: tst ip, #8 movne r3, r7, lsr #8 - ldmneia r1!, {r4, r7} @ Shouldn't fault + ldmneia r1!, {r4, r7} @ Shouldnt fault orrne r3, r3, r4, lsl #24 movne r4, r4, lsr #8 orrne r4, r4, r7, lsl #24 @@ -446,7 +446,7 @@ USER( ldrt r7, [r1], #4) @ May fault blt .cfu_2rem8lp .cfu_2cpy8lp: mov r3, r7, lsr #16 - ldmia r1!, {r4 - r7} @ Shouldn't fault + ldmia r1!, {r4 - r7} @ Shouldnt fault orr r3, r3, r4, lsl #16 mov r4, r4, lsr #16 orr r4, r4, r5, lsl #16 @@ -459,7 +459,7 @@ USER( ldrt r7, [r1], #4) @ May fault bpl .cfu_2cpy8lp .cfu_2rem8lp: tst ip, #8 movne r3, r7, lsr #16 - ldmneia r1!, {r4, r7} @ Shouldn't fault + ldmneia r1!, {r4, r7} @ Shouldnt fault orrne r3, r3, r4, lsl #16 movne r4, r4, lsr #16 orrne r4, r4, r7, lsl #16 @@ -500,7 +500,7 @@ USER( ldrt r7, [r1], #4) @ May fault blt .cfu_3rem8lp .cfu_3cpy8lp: mov r3, r7, lsr #24 - ldmia r1!, {r4 - r7} @ Shouldn't fault + ldmia r1!, {r4 - r7} @ Shouldnt fault orr r3, r3, r4, lsl #8 mov r4, r4, lsr #24 orr r4, r4, r5, lsl #8 @@ -513,7 +513,7 @@ USER( ldrt r7, [r1], #4) @ May fault bpl .cfu_3cpy8lp .cfu_3rem8lp: tst ip, #8 movne r3, r7, lsr #24 - ldmneia r1!, {r4, r7} @ Shouldn't fault + ldmneia r1!, {r4, r7} @ Shouldnt fault orrne r3, r3, r4, lsl #8 movne r4, r4, lsr #24 orrne r4, r4, r7, lsl #8 @@ -597,7 +597,7 @@ USER( strnebt r2, [r0], #1) * or zero on exception, or n + 1 if too long */ ENTRY(__arch_strnlen_user) - stmfd sp!, {lr} + str lr, [sp, #-4]! mov r2, r0 1: USER( ldrbt r3, [r0], #1) @@ -623,7 +623,7 @@ USER( ldrbt r3, [r0], #1) * Returns : number of characters copied */ ENTRY(__arch_strncpy_from_user) - stmfd sp!, {lr} + str lr, [sp, #-4]! add ip, r1, #1 1: subs r2, r2, #1 bmi 2f diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index faedecd2d..075193467 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile @@ -7,8 +7,10 @@ # # Note 2! The CFLAGS definition is now in the main makefile... +USE_STANDARD_AS_RULE := true + O_TARGET := mm.o -O_OBJS := consistent.o extable.o fault-$(PROCESSOR).o init.o \ +O_OBJS := extable.o fault-$(PROCESSOR).o init.o \ mm-$(PROCESSOR).o small_page.o ifeq ($(CONFIG_CPU_26),y) @@ -31,14 +33,11 @@ ifeq ($(CONFIG_CPU_32),y) ifeq ($(CONFIG_CPU_SA1100),y) P_OBJS += proc-sa110.o endif - O_OBJS += mm-$(MACHINE).o ioremap.o $(sort $(P_OBJS)) + O_OBJS += mm-$(MACHINE).o consistent.o ioremap.o $(sort $(P_OBJS)) endif include $(TOPDIR)/Rules.make -.S.o: - $(CC) $(AFLAGS) $(AFLAGS_$@) -traditional -c -o $*.o $< - # Special dependencies fault-armv.o: fault-common.c fault-armo.o: fault-common.c diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 72eaa2e47..ba58e8bad 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c @@ -18,12 +18,10 @@ #include #include #include -#ifdef CONFIG_BLK_DEV_INITRD #include -#endif -#include #include +#include #include #include #include @@ -151,11 +149,18 @@ void show_mem(void) end = page + NODE_DATA(node)->node_size; do { - if (PageSkip(page)) { - page = page->next_hash; - if (page == NULL) - break; - } +/* This is currently broken + * PG_skip is used on sparc/sparc64 architectures to "skip" certain + * parts of the address space. + * + * #define PG_skip 10 + * #define PageSkip(page) (machine_is_riscpc() && test_bit(PG_skip, &(page)->flags)) + * if (PageSkip(page)) { + * page = page->next_hash; + * if (page == NULL) + * break; + * } + */ total++; if (PageReserved(page)) reserved++; @@ -554,7 +559,7 @@ void __init mem_init(void) initpages = &__init_end - &__init_begin; high_memory = (void *)__va(meminfo.end); - max_mapnr = MAP_NR(high_memory); + max_mapnr = virt_to_page(high_memory) - mem_map; /* * We may have non-contiguous memory. @@ -598,9 +603,9 @@ void __init mem_init(void) static inline void free_area(unsigned long addr, unsigned long end, char *s) { unsigned int size = (end - addr) >> 10; - struct page *page = virt_to_page(addr); - for (; addr < end; addr += PAGE_SIZE, page ++) { + for (; addr < end; addr += PAGE_SIZE) { + struct page *page = virt_to_page(addr); ClearPageReserved(page); set_page_count(page, 1); free_page(addr); @@ -608,18 +613,14 @@ static inline void free_area(unsigned long addr, unsigned long end, char *s) } if (size) - printk(" %dk %s", size, s); + printk("Freeing %s memory: %dK\n", s, size); } void free_initmem(void) { - printk("Freeing unused kernel memory:"); - free_area((unsigned long)(&__init_begin), (unsigned long)(&__init_end), "init"); - - printk("\n"); } #ifdef CONFIG_BLK_DEV_INITRD @@ -628,17 +629,8 @@ static int keep_initrd; void free_initrd_mem(unsigned long start, unsigned long end) { - unsigned long addr; - - if (!keep_initrd) { - for (addr = start; addr < end; addr += PAGE_SIZE) { - ClearPageReserved(virt_to_page(addr)); - set_page_count(virt_to_page(addr), 1); - free_page(addr); - totalram_pages++; - } - printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); - } + if (!keep_initrd) + free_area(start, end, "initrd"); } static int __init keepinitrd_setup(char *__unused) diff --git a/arch/arm/mm/mm-footbridge.c b/arch/arm/mm/mm-footbridge.c index b11d55a1b..2c555f46d 100644 --- a/arch/arm/mm/mm-footbridge.c +++ b/arch/arm/mm/mm-footbridge.c @@ -47,6 +47,28 @@ #else +/* + * The mapping when the footbridge is in add-in mode. + */ +#define MAPPING \ + { PCIO_BASE, DC21285_PCI_IO, PCIO_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ + { XBUS_BASE, 0x40000000, XBUS_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ + { ARMCSR_BASE, DC21285_ARMCSR_BASE, ARMCSR_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ + { WFLUSH_BASE, DC21285_OUTBOUND_WRITE_FLUSH, WFLUSH_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ + { FLASH_BASE, DC21285_FLASH, FLASH_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ + { PCIMEM_BASE, DC21285_PCI_MEM, PCIMEM_SIZE, DOMAIN_IO, 0, 1, 0, 0 } + +#endif + +struct map_desc io_desc[] __initdata = { + MAPPING +}; + +unsigned int __initdata io_desc_size = SIZE(io_desc); + + +#ifdef CONFIG_FOOTBRIDGE_ADDIN + /* * These two functions convert virtual addresses to PCI addresses * and PCI addresses to virtual addresses. Note that it is only @@ -78,22 +100,4 @@ unsigned long __bus_to_virt(unsigned long res) return res; } -/* - * The mapping when the footbridge is in add-in mode. - */ -#define MAPPING \ - { PCIO_BASE, DC21285_PCI_IO, PCIO_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ - { XBUS_BASE, 0x40000000, XBUS_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ - { ARMCSR_BASE, DC21285_ARMCSR_BASE, ARMCSR_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ - { WFLUSH_BASE, DC21285_OUTBOUND_WRITE_FLUSH, WFLUSH_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ - { FLASH_BASE, DC21285_FLASH, FLASH_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, \ - { PCIMEM_BASE, DC21285_PCI_MEM, PCIMEM_SIZE, DOMAIN_IO, 0, 1, 0, 0 } - #endif - -struct map_desc io_desc[] __initdata = { - MAPPING -}; - -unsigned int __initdata io_desc_size = SIZE(io_desc); - diff --git a/arch/arm/mm/mm-l7200.c b/arch/arm/mm/mm-l7200.c index 14dc5c6e4..8a252d684 100644 --- a/arch/arm/mm/mm-l7200.c +++ b/arch/arm/mm/mm-l7200.c @@ -1,9 +1,9 @@ /* * arch/arm/mm/mm-lusl7200.c * - * Extra MM routines for LUSL7200 architecture + * Extra MM routines for L7200 architecture * - * Copyright (C) 2000 Steven J. Hill + * Copyright (C) 2000 Steve Hill (sjhill@cotw.com) */ #include diff --git a/arch/arm/mm/mm-sa1100.c b/arch/arm/mm/mm-sa1100.c index c1ecf3fb1..aaf28f880 100644 --- a/arch/arm/mm/mm-sa1100.c +++ b/arch/arm/mm/mm-sa1100.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "map.h" @@ -53,6 +54,15 @@ static struct map_desc assabet_io_desc[] __initdata = { #endif }; +static struct map_desc nanoengine_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_NANOENGINE + { 0xd0000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ + { 0xd4000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* System Registers */ + { 0xdc000000, 0x18A00000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Internal PCI Config Space */ + SA1100_STD_IO_MAPPING +#endif +}; + static struct map_desc bitsy_io_desc[] __initdata = { #ifdef CONFIG_SA1100_BITSY { 0xd0000000, 0x00000000, 0x02000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ @@ -61,6 +71,14 @@ static struct map_desc bitsy_io_desc[] __initdata = { #endif }; +static struct map_desc cerf_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_CERF + { 0xd8000000, 0x08000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* Crystal Chip */ + { 0xd0000000, 0x00000000, 0x01000000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash bank 0 */ + SA1100_STD_IO_MAPPING +#endif +}; + static struct map_desc empeg_io_desc[] __initdata = { #ifdef CONFIG_SA1100_EMPEG { EMPEG_FLASHBASE, 0x00000000, 0x00200000, DOMAIN_IO, 1, 1, 0, 0 }, /* Flash */ @@ -77,6 +95,14 @@ static struct map_desc graphicsclient_io_desc[] __initdata = { #endif }; +static struct map_desc lart_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_LART + { 0xd0000000, 0x00000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash memory */ + { 0xd8000000, 0x08000000, 0x00400000, DOMAIN_IO, 1, 1, 0, 0 }, /* main flash, alternative location */ + SA1100_STD_IO_MAPPING +#endif +}; + static struct map_desc thinclient_io_desc[] __initdata = { #ifdef CONFIG_SA1100_THINCLIENT #if 0 @@ -104,6 +130,14 @@ static struct map_desc victor_io_desc[] __initdata = { #endif }; +static struct map_desc xp860_io_desc[] __initdata = { +#ifdef CONFIG_SA1100_XP860 + { 0xd8000000, 0x40000000, 0x00800000, DOMAIN_IO, 1, 1, 0, 0 }, /* SA-1111 */ + { 0xda000000, 0x10000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* SCSI */ + { 0xdc000000, 0x18000000, 0x00100000, DOMAIN_IO, 1, 1, 0, 0 }, /* LAN */ + SA1100_STD_IO_MAPPING +#endif +}; static struct map_desc default_io_desc[] __initdata = { SA1100_STD_IO_MAPPING @@ -122,15 +156,24 @@ void __init select_sa1100_io_desc(void) if( machine_is_assabet() ) { memcpy( io_desc, assabet_io_desc, sizeof(assabet_io_desc) ); io_desc_size = SIZE(assabet_io_desc); + } else if( machine_is_nanoengine() ) { + memcpy( io_desc, nanoengine_io_desc, sizeof(nanoengine_io_desc) ); + io_desc_size = SIZE(nanoengine_io_desc); } else if( machine_is_bitsy() ) { memcpy( io_desc, bitsy_io_desc, sizeof(bitsy_io_desc) ); io_desc_size = SIZE(bitsy_io_desc); + } else if( machine_is_cerf() ) { + memcpy( io_desc, cerf_io_desc, sizeof(cerf_io_desc) ); + io_desc_size = SIZE(cerf_io_desc); } else if( machine_is_empeg() ) { memcpy( io_desc, empeg_io_desc, sizeof(empeg_io_desc) ); io_desc_size = SIZE(empeg_io_desc); } else if( machine_is_graphicsclient() ) { memcpy( io_desc, graphicsclient_io_desc, sizeof(graphicsclient_io_desc) ); io_desc_size = SIZE(graphicsclient_io_desc); + } else if( machine_is_lart() ) { + memcpy( io_desc, lart_io_desc, sizeof(lart_io_desc) ); + io_desc_size = SIZE(lart_io_desc); } else if( machine_is_thinclient() ) { memcpy( io_desc, thinclient_io_desc, sizeof(thinclient_io_desc) ); io_desc_size = SIZE(thinclient_io_desc); @@ -140,6 +183,9 @@ void __init select_sa1100_io_desc(void) } else if( machine_is_victor() ) { memcpy( io_desc, victor_io_desc, sizeof(victor_io_desc) ); io_desc_size = SIZE(victor_io_desc); + } else if( machine_is_xp860() ) { + memcpy( io_desc, xp860_io_desc, sizeof(xp860_io_desc) ); + io_desc_size = SIZE(xp860_io_desc); } else { memcpy( io_desc, default_io_desc, sizeof(default_io_desc) ); io_desc_size = SIZE(default_io_desc); diff --git a/arch/arm/mm/proc-arm720.S b/arch/arm/mm/proc-arm720.S index d49196625..262a4fd8b 100644 --- a/arch/arm/mm/proc-arm720.S +++ b/arch/arm/mm/proc-arm720.S @@ -10,11 +10,13 @@ * Changelog: * 05-09-2000 SJH Created by moving 720 specific functions * out of 'proc-arm6,7.S' per RSK discussion + * 07-25-2000 SJH Added idle function. */ #include #include #include #include +#include #include "../lib/constants.h" /* @@ -127,8 +129,8 @@ ENTRY(cpu_arm720_data_abort) add pc, pc, r2, lsr #22 @ Now branch to the relevent processing routine movs pc, lr - b Ldata_unknown - b Ldata_unknown + b Ldata_lateldrhpost @ ldrh rd, [rn], #m/rm + b Ldata_lateldrhpre @ ldrh rd, [rn, #m/rm] b Ldata_unknown b Ldata_unknown b Ldata_lateldrpostconst @ ldr rd, [rn], #m @@ -142,6 +144,7 @@ ENTRY(cpu_arm720_data_abort) b Ldata_simple @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m b Ldata_simple @ ldc rd, [rn, #m] b Ldata_unknown + Ldata_unknown: @ Part of jumptable mov r0, r2 mov r1, r4 @@ -149,6 +152,33 @@ Ldata_unknown: @ Part of jumptable bl baddataabort b ret_from_sys_call +Ldata_lateldrhpre: + tst r4, #1 << 21 @ check writeback bit + beq Ldata_simple +Ldata_lateldrhpost: + tst r4, #1 << 22 @ check if register or immediate offset + beq Ldata_lateldrhpostreg +Ldata_lateldrhpostconst: + and r2, r4, #0xf @ load and clear low nibble of const offset + and r5, r4, #0xf00 @ load and clear high nibble of const offset + orrs r2, r2, r5, lsr #4 @ create offset + beq Ldata_simple @ don't have to do anything if zero + and r5, r4, #0xf << 16 @ get Rn + ldr r0, [sp, r5, lsr #14] + tst r4, #1 << 23 @ U bit + subne r7, r0, r2, lsr #20 + addeq r7, r0, r2, lsr #20 + b Ldata_saver7 +Ldata_lateldrhpostreg: + and r5, r4, #0xf + ldr r2, [sp, r5, lsl #2] @ get Rm + and r5, r4, #0xf << 16 + ldr r0, [sp, r5, lsr #14] @ get Rn + tst r4, #1 << 23 + subne r7, r0, r2 + addeq r7, r0, r2 + b Ldata_saver7 + Ldata_lateldrpreconst: tst r4, #1 << 21 @ check writeback bit beq Ldata_simple @@ -219,7 +249,6 @@ Ldata_lateldrpostreg: * Function: arm720_check_bugs (void) * : arm720_proc_init (void) * : arm720_proc_fin (void) - * : arm720_proc_do_idle (void) * * Notes : This processor does not require these */ @@ -240,8 +269,22 @@ ENTRY(cpu_arm720_proc_fin) mcr p15, 0, r0, c1, c0, 0 @ disable caches mov pc, lr +/* + * Function: arm720_proc_do_idle (void) + * + * Params : r0 = call type: + * 0 = slow idle + * 1 = fast idle + * 2 = switch to slow processor clock + * 3 = switch to fast processor clock + * + * Purpose : put the processer in proper idle mode + */ ENTRY(cpu_arm720_do_idle) - mov r0, #-EINVAL + ldr r2, =IO_BASE @ Virt addr of IO + add r2, r2, #0x00050000 @ Start of PMU regs + mov r1, #0x01 @ Idle mode + str r1, [r2, #4] mov pc, lr /* diff --git a/arch/arm/mm/proc-sa110.S b/arch/arm/mm/proc-sa110.S index 8c7a6b749..bf75c97a2 100644 --- a/arch/arm/mm/proc-sa110.S +++ b/arch/arm/mm/proc-sa110.S @@ -313,8 +313,8 @@ ENTRY(cpu_sa1100_data_abort) ldr r1, [r0] @ read instruction causing problem mrc p15, 0, r0, c6, c0, 0 @ get FAR mov r1, r1, lsr #19 @ b1 = L - and r1, r1, #2 mrc p15, 0, r3, c5, c0, 0 @ get FSR + and r1, r1, #2 and r3, r3, #255 mov pc, lr diff --git a/arch/arm/nwfpe/Makefile b/arch/arm/nwfpe/Makefile index a14371e5d..a7f69d405 100644 --- a/arch/arm/nwfpe/Makefile +++ b/arch/arm/nwfpe/Makefile @@ -4,6 +4,8 @@ # Copyright (C) 1998, 1999 Philip Blundell # +USE_STANDARD_AS_RULE := true + NWFPE_OBJS := fpa11.o fpa11_cpdo.o fpa11_cpdt.o fpa11_cprt.o \ fpmodule.o fpopcode.o softfloat.o \ single_cpdo.o double_cpdo.o extended_cpdo.o diff --git a/arch/arm/tools/gen-mach-types b/arch/arm/tools/gen-mach-types new file mode 100644 index 000000000..2f9c9b5dd --- /dev/null +++ b/arch/arm/tools/gen-mach-types @@ -0,0 +1,73 @@ +#!/bin/awk +# +# Awk script to generate include/asm-arm/mach-types.h +# +BEGIN { nr = 0 } +/^#/ { next } +/^[ ]*$/ { next } + +NF == 4 { + machine_is[nr] = "machine_is_"$1; + config[nr] = "CONFIG_"$2; + mach_type[nr] = "MACH_TYPE_"$3; + num[nr] = $4; nr++ + } + +NF == 3 { + machine_is[nr] = "machine_is_"$1; + config[nr] = "CONFIG_"$2; + mach_type[nr] = "MACH_TYPE_"$3; + num[nr] = ""; nr++ + } + + +END { + printf("/*\n"); + printf(" * This was automagically generated from %s!\n", FILENAME); + printf(" * Do NOT edit\n"); + printf(" */\n\n"); + printf("#ifndef __ASM_ARM_MACH_TYPE_H\n"); + printf("#define __ASM_ARM_MACH_TYPE_H\n\n"); + printf("#include \n\n"); + printf("#ifndef __ASSEMBLY__\n"); + printf("/* The type of machine we're running on */\n"); + printf("extern unsigned int __machine_arch_type;\n"); + printf("#endif\n\n"); + + printf("/* see arch/arm/kernel/arch.c for a description of these */\n"); + for (i = 0; i < nr; i++) + if (num[i] ~ /..*/) + printf("#define %-30s %d\n", mach_type[i], num[i]); + + printf("\n"); + + for (i = 0; i < nr; i++) + if (num[i] ~ /..*/) { + printf("#ifdef %s\n", config[i]); + printf("# ifdef machine_arch_type\n"); + printf("# undef machine_arch_type\n"); + printf("# define machine_arch_type\t__machine_arch_type\n"); + printf("# else\n"); + printf("# define machine_arch_type\t%s\n", mach_type[i]); + printf("# endif\n"); + printf("# define %s()\t(machine_arch_type == %s)\n", machine_is[i], mach_type[i]); + printf("#else\n"); + printf("# define %s()\t(0)\n", machine_is[i]); + printf("#endif\n\n"); + } + + printf("/*\n * These have not yet been registered\n */\n"); + for (i = 0; i < nr; i++) + if (num[i] !~ /..*/) + printf("/* #define %-30s <> */\n", mach_type[i]); + + for (i = 0; i < nr; i++) + if (num[i] !~ /..*/) { + printf("#define %s()\t(0)\n", machine_is[i]); + } + + printf("\n#ifndef machine_arch_type\n"); + printf("#define machine_arch_type\t__machine_arch_type\n"); + printf("#endif\n\n"); + printf("#endif\n"); + } diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types new file mode 100644 index 000000000..b922786e3 --- /dev/null +++ b/arch/arm/tools/mach-types @@ -0,0 +1,44 @@ +# Database of machine macros and numbers +# +# To add an entry into this database, please see +# Documentation/arm/README +# +# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number +# +ebsa110 ARCH_EBSA110 EBSA110 0 +riscpc ARCH_RPC RISCPC 1 +nexuspci ARCH_NEXUSPCI NEXUSPCI 3 +ebsa285 ARCH_EBSA285 EBSA285 4 +netwinder ARCH_NETWINDER NETWINDER 5 +cats ARCH_CATS CATS 6 +tbox ARCH_TBOX TBOX 7 +co285 ARCH_CO285 CO285 8 +clps7110 ARCH_CLPS7110 CLPS7110 9 +arc ARCH_ARC ARCHIMEDES 10 +a5k ARCH_A5K A5K 11 +etoile ARCH_ETOILE ETOILE 12 +lacie_nas ARCH_LACIE_NAS LACIE_NAS 13 +clps7500 ARCH_CLPS7500 CLPS7500 14 +shark ARCH_SHARK SHARK 15 +brutus SA1100_BRUTUS BRUTUS 16 +personal_server ARCH_PERSONAL_SERVER PERSONAL_SERVER 17 +itsy SA1100_ITSY ITSY 18 +l7200 ARCH_L7200 L7200 19 +pleb SA1100_PLEB PLEB 20 +integrator ARCH_INTEGRATOR INTEGRATOR 21 +bitsy SA1100_BITSY BITSY 22 +ixp1200 ARCH_IXP1200 IXP1200 23 +thinclient SA1100_THINCLIENT THINCLIENT 24 +assabet SA1100_ASSABET ASSABET 25 +victor SA1100_VICTOR VICTOR 26 +lart SA1100_LART LART 27 +ranger ARCH_RANGER RANGER 28 +graphicsclient SA1100_GRAPHICSCLIENT GRAPHICSCLIENT 29 +xp860 SA1100_XP860 XP860 30 +cerf SA1100_CERF CERF 31 +nanoengine SA1100_NANOENGINE NANOENGINE 32 + +# The following are unallocated +empeg SA1100_EMPEG EMPEG +tifon SA1100_TIFON TIFON +penny SA1100_PENNY PENNY -- cgit v1.2.3