summaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-08-28 22:00:09 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-08-28 22:00:09 +0000
commit1a1d77dd589de5a567fa95e36aa6999c704ceca4 (patch)
tree141e31f89f18b9fe0831f31852e0435ceaccafc5 /arch/arm
parentfb9c690a18b3d66925a65b17441c37fa14d4370b (diff)
Merge with 2.4.0-test7.
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/Makefile77
-rw-r--r--arch/arm/boot/Makefile90
-rw-r--r--arch/arm/boot/bootp/Makefile26
-rw-r--r--arch/arm/boot/bootp/init.S57
-rw-r--r--arch/arm/boot/compressed/Makefile55
-rw-r--r--arch/arm/boot/compressed/head-l7200.S30
-rw-r--r--arch/arm/boot/compressed/head-netwinder.S38
-rw-r--r--arch/arm/boot/compressed/head-sa1100.S28
-rw-r--r--arch/arm/boot/compressed/head.S29
-rw-r--r--arch/arm/boot/compressed/hw-bse.c74
-rw-r--r--arch/arm/boot/compressed/setup-sa1100.S26
-rw-r--r--arch/arm/config.in92
-rw-r--r--arch/arm/kernel/Makefile11
-rw-r--r--arch/arm/kernel/arch.c56
-rw-r--r--arch/arm/kernel/armksyms.c10
-rw-r--r--arch/arm/kernel/bios32.c33
-rw-r--r--arch/arm/kernel/calls.S3
-rw-r--r--arch/arm/kernel/debug-armv.S8
-rw-r--r--arch/arm/kernel/dec21285.c2
-rw-r--r--arch/arm/kernel/dma-arc.c1
-rw-r--r--arch/arm/kernel/dma-rpc.c2
-rw-r--r--arch/arm/kernel/dma.c25
-rw-r--r--arch/arm/kernel/ecard.c25
-rw-r--r--arch/arm/kernel/entry-armo.S18
-rw-r--r--arch/arm/kernel/entry-armv.S16
-rw-r--r--arch/arm/kernel/entry-common.S24
-rw-r--r--arch/arm/kernel/fiq.c7
-rw-r--r--arch/arm/kernel/head-armo.S87
-rw-r--r--arch/arm/kernel/head-armv.S44
-rw-r--r--arch/arm/kernel/hw-footbridge.c2
-rw-r--r--arch/arm/kernel/hw-sa1100.c35
-rw-r--r--arch/arm/kernel/irq.c16
-rw-r--r--arch/arm/kernel/leds-footbridge.c19
-rw-r--r--arch/arm/kernel/leds-sa1100.c106
-rw-r--r--arch/arm/kernel/oldlatches.c5
-rw-r--r--arch/arm/kernel/process.c5
-rw-r--r--arch/arm/kernel/semaphore.c131
-rw-r--r--arch/arm/kernel/setup.c14
-rw-r--r--arch/arm/kernel/signal.c131
-rw-r--r--arch/arm/kernel/traps.c4
-rw-r--r--arch/arm/lib/Makefile5
-rw-r--r--arch/arm/lib/uaccess.S54
-rw-r--r--arch/arm/mm/Makefile9
-rw-r--r--arch/arm/mm/init.c46
-rw-r--r--arch/arm/mm/mm-footbridge.c40
-rw-r--r--arch/arm/mm/mm-l7200.c4
-rw-r--r--arch/arm/mm/mm-sa1100.c46
-rw-r--r--arch/arm/mm/proc-arm720.S51
-rw-r--r--arch/arm/mm/proc-sa110.S2
-rw-r--r--arch/arm/nwfpe/Makefile2
-rw-r--r--arch/arm/tools/gen-mach-types73
-rw-r--r--arch/arm/tools/mach-types44
52 files changed, 1331 insertions, 507 deletions
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 <sjhill@cotw.com>
+ *
+ * Some code borrowed from Nicola Pitre's 'head-sa1100.S' file. This
+ * is merged with head.S by the linker.
+ */
+
+#include <linux/config.h>
+
+#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 <linux/config.h>
#include <linux/linkage.h>
+#include <asm/mach-types.h>
#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 <linux/config.h>
#include <linux/linkage.h>
-
/*
* 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 <linux/linkage.h>
+#include <linux/config.h>
+#include <asm/mach-types.h>
.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 <asm/dec21285.h>
#include <asm/elf.h>
#include <asm/setup.h>
-#include <asm/system.h>
+#include <asm/mach-types.h>
#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 <asm/system.h>
#include <asm/uaccess.h>
#include <asm/checksum.h>
+#include <asm/mach-types.h>
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 <linux/init.h>
#include <asm/irq.h>
-#include <asm/system.h>
+#include <asm/mach-types.h>
#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 = (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 <asm/fiq.h>
#include <asm/io.h>
#include <asm/hardware.h>
+#include <asm/mach-types.h>
#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(&current->blocked);
- sigemptyset(&current->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(&current->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 <linux/config.h>
+
+#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 <linux/config.h>
#include <linux/linkage.h>
+#include <asm/mach-types.h>
.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 <asm/io.h>
#include <asm/leds.h>
-#include <asm/system.h>
+#include <asm/mach-types.h>
#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 <asm/delay.h>
#include <asm/hardware.h>
-
+#include <asm/mach-types.h>
/*
* 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 <asm/io.h>
#include <asm/system.h>
-#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 <asm/hardware.h>
#include <asm/leds.h>
+#include <asm/mach-types.h>
#include <asm/system.h>
#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 <asm/hardware.h>
#include <asm/leds.h>
+#include <asm/mach-types.h>
#include <asm/system.h>
@@ -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 <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
+#include <linux/sched.h>
#include <asm/io.h>
#include <asm/hardware.h>
+#include <asm/mach-types.h>
+#include <asm/arch/oldlatches.h>
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 <asm/system.h>
#include <asm/io.h>
+#include <asm/leds.h>
#include <asm/uaccess.h>
/*
@@ -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 <linux/config.h>
#include <linux/sched.h>
#include <asm/semaphore.h>
@@ -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 <asm/io.h>
#include <asm/procinfo.h>
#include <asm/setup.h>
-#include <asm/system.h>
+#include <asm/mach-types.h>
#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 <linux/smp.h>
#include <linux/init.h>
#include <linux/bootmem.h>
-#ifdef CONFIG_BLK_DEV_INITRD
#include <linux/blk.h>
-#endif
-#include <asm/system.h>
#include <asm/segment.h>
+#include <asm/mach-types.h>
#include <asm/pgalloc.h>
#include <asm/dma.h>
#include <asm/hardware.h>
@@ -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
@@ -48,6 +48,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
* legal to use these on memory obtained via get_free_page or
@@ -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 <linux/init.h>
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 <asm/hardware.h>
#include <asm/pgtable.h>
#include <asm/page.h>
+#include <asm/mach-types.h>
#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 <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/procinfo.h>
#include <asm/errno.h>
+#include <asm/hardware.h>
#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 <linux/config.h>\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 <<not registered>> */\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