summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/zaurus/Makefile30
-rw-r--r--sys/arch/zaurus/compile/.cvsignore2
-rw-r--r--sys/arch/zaurus/conf/GENERIC113
-rw-r--r--sys/arch/zaurus/conf/Makefile.zaurus223
-rw-r--r--sys/arch/zaurus/conf/RAMDISK141
-rw-r--r--sys/arch/zaurus/conf/files.zaurus81
-rw-r--r--sys/arch/zaurus/include/ansi.h4
-rw-r--r--sys/arch/zaurus/include/asm.h4
-rw-r--r--sys/arch/zaurus/include/atomic.h2
-rw-r--r--sys/arch/zaurus/include/bootconfig.h76
-rw-r--r--sys/arch/zaurus/include/bus.h4
-rw-r--r--sys/arch/zaurus/include/cdefs.h4
-rw-r--r--sys/arch/zaurus/include/conf.h19
-rw-r--r--sys/arch/zaurus/include/cpu.h4
-rw-r--r--sys/arch/zaurus/include/db_machdep.h4
-rw-r--r--sys/arch/zaurus/include/disklabel.h4
-rw-r--r--sys/arch/zaurus/include/elf_abi.h3
-rw-r--r--sys/arch/zaurus/include/endian.h4
-rw-r--r--sys/arch/zaurus/include/exec.h48
-rw-r--r--sys/arch/zaurus/include/float.h4
-rw-r--r--sys/arch/zaurus/include/fp.h4
-rw-r--r--sys/arch/zaurus/include/frame.h4
-rw-r--r--sys/arch/zaurus/include/ieee.h4
-rw-r--r--sys/arch/zaurus/include/ieeefp.h4
-rw-r--r--sys/arch/zaurus/include/internal_types.h7
-rw-r--r--sys/arch/zaurus/include/intr.h159
-rw-r--r--sys/arch/zaurus/include/irqhandler.h4
-rw-r--r--sys/arch/zaurus/include/isa_machdep.h13
-rw-r--r--sys/arch/zaurus/include/limits.h4
-rw-r--r--sys/arch/zaurus/include/lock.h4
-rw-r--r--sys/arch/zaurus/include/math.h4
-rw-r--r--sys/arch/zaurus/include/param.h51
-rw-r--r--sys/arch/zaurus/include/pcb.h4
-rw-r--r--sys/arch/zaurus/include/pio.h4
-rw-r--r--sys/arch/zaurus/include/pmap.h4
-rw-r--r--sys/arch/zaurus/include/proc.h4
-rw-r--r--sys/arch/zaurus/include/profile.h4
-rw-r--r--sys/arch/zaurus/include/psl.h1
-rw-r--r--sys/arch/zaurus/include/ptrace.h4
-rw-r--r--sys/arch/zaurus/include/reg.h4
-rw-r--r--sys/arch/zaurus/include/reloc.h2
-rw-r--r--sys/arch/zaurus/include/rtc.h4
-rw-r--r--sys/arch/zaurus/include/setjmp.h4
-rw-r--r--sys/arch/zaurus/include/signal.h4
-rw-r--r--sys/arch/zaurus/include/spinlock.h6
-rw-r--r--sys/arch/zaurus/include/stdarg.h3
-rw-r--r--sys/arch/zaurus/include/sysarch.h4
-rw-r--r--sys/arch/zaurus/include/trap.h4
-rw-r--r--sys/arch/zaurus/include/types.h11
-rw-r--r--sys/arch/zaurus/include/vmparam.h100
-rw-r--r--sys/arch/zaurus/include/zaurus_reg.h96
-rw-r--r--sys/arch/zaurus/include/zaurus_var.h100
-rw-r--r--sys/arch/zaurus/zaurus/autoconf.c505
-rw-r--r--sys/arch/zaurus/zaurus/obio.c341
-rw-r--r--sys/arch/zaurus/zaurus/zaurus_lcd.c328
-rw-r--r--sys/arch/zaurus/zaurus/zaurus_machdep.c1404
-rw-r--r--sys/arch/zaurus/zaurus/zaurus_reg.h96
-rw-r--r--sys/arch/zaurus/zaurus/zaurus_start.S174
-rw-r--r--sys/arch/zaurus/zaurus/zaurus_var.h100
59 files changed, 4351 insertions, 0 deletions
diff --git a/sys/arch/zaurus/Makefile b/sys/arch/zaurus/Makefile
new file mode 100644
index 00000000000..e440330a0c0
--- /dev/null
+++ b/sys/arch/zaurus/Makefile
@@ -0,0 +1,30 @@
+/* $OpenBSD: Makefile,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+# $NetBSD: Makefile,v 1.1 2001/06/12 08:32:46 chris Exp $
+
+# Makefile for zaurus tags file and boot blocks
+
+TCATS= ../zaurus/tags
+SCATS= ../zaurus/zaurus/*.[ch] ../zaurus/include/*.h \
+ ../zaurus/isa/*.[ch]
+ACATS= ../zaurus/zaurus/*.S
+
+# Directories in which to place tags links
+DCATS= isa include
+
+.include "../../kern/Make.tags.inc"
+
+tags:
+ -ctags -wdtf ${TCATS} ${SCATS} ${COMM}
+ egrep "^ENTRY(.*)|^ALTENTRY(.*)" ${ACATS} | \
+ sed "s;\([^:]*\):\([^(]*\)(\([^, )]*\)\(.*\);\3 \1 /^\2(\3\4$$/;" \
+ >> ${TCATS}
+ sort -o ${TCATS} ${TCATS}
+
+links:
+ -for i in ${DCATS}; do \
+ cd $$i && rm -f tags; ln -s ../tags tags; done
+
+
+SUBDIR=
+
+.include <bsd.subdir.mk>
diff --git a/sys/arch/zaurus/compile/.cvsignore b/sys/arch/zaurus/compile/.cvsignore
new file mode 100644
index 00000000000..b72af3039e6
--- /dev/null
+++ b/sys/arch/zaurus/compile/.cvsignore
@@ -0,0 +1,2 @@
+GENERIC
+RAMDISK
diff --git a/sys/arch/zaurus/conf/GENERIC b/sys/arch/zaurus/conf/GENERIC
new file mode 100644
index 00000000000..44a7d6d63b7
--- /dev/null
+++ b/sys/arch/zaurus/conf/GENERIC
@@ -0,0 +1,113 @@
+# $OpenBSD: GENERIC,v 1.1 2004/12/31 00:04:35 drahn Exp $
+#
+# GENERIC machine description file
+#
+# This machine description file is used to generate the default OpenBSD
+# kernel. The generic kernel does not include all options, subsystems
+# and device drivers, but should be useful for most applications.
+#
+# The machine description file can be customised for your specific
+# machine to reduce the kernel size and improve its performance.
+#
+# For further information on compiling OpenBSD kernels, see the config(8)
+# man page.
+#
+# For further information on hardware support for this architecture, see
+# the intro(4) man page. For further information about kernel options
+# for this architecture, see the options(4) man page. For an explanation
+# of each device driver in this file see the section 4 man page for the
+# device.
+
+machine zaurus arm
+
+include "../../../conf/GENERIC"
+
+options ARM32
+#options ARM_INTR_IMPL="<arch/arm/xscale/pxa2x0_intr.h>"
+options PXA2x0_INTR
+options COTULLA
+options LUBBOCK
+options PXAGPIO_HAS_GPION_INTRS
+
+options CACHE_CLEAN_BLOCK_INTR
+
+makeoptions KERNEL_BASE_PHYS="0xa0200000"
+makeoptions KERNEL_BASE_VIRT="0xc0200000"
+makeoptions BOARDTYPE="zaurus"
+
+# estimated number of users
+
+maxusers 32
+
+# Standard system options
+
+#options UCONSOLE # users can use TIOCCONS (for xconsole)
+#options INSECURE # disable kernel securelevel
+
+#options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT
+#options NTP # NTP phase/frequency locked loop
+
+# CPU options
+options CPU_XSCALE_PXA2X0 # Support the XScale core
+options XSCALE_CACHE_WRITE_THROUGH
+#options XSCALE_CACHE_WRITE_BACK
+makeoptions CPUFLAGS="-mcpu=xscale"
+
+
+# FPA options
+
+#options ARMFPE # ARM Ltd FPE
+
+#option WSDISPLAY_COMPAT_USL # VT handling
+#option WSDISPLAY_COMPAT_RAWKBD # can get raw scancodes
+#option WSDISPLAY_DEFAULTSCREENS=6 # can get raw scancodes
+#option WSDISPLAY_COMPAT_PCVT # can get raw scancodes
+
+#config bsd swap generic
+config bsd root on wd0a
+
+# The main bus device
+mainbus0 at root
+cpu0 at mainbus?
+pxaip0 at mainbus?
+
+pxaintc0 at pxaip? # interrupt controller
+pxagpio0 at pxaip? # GPIO
+saost0 at pxaip? addr 0x40a00000 size 0x20
+
+# cotulla integrated 16550 UARTs
+options COM_PXA2X0
+com0 at pxaip? addr 0x40100000 intr 22 # Full Function UART
+com1 at pxaip? addr 0x40200000 intr 21 # BlueTootth UART
+#com2 at pxaip? addr 0x40700000 intr 20 # Standard UART (for IrDA)
+options FFUARTCONSOLE
+#options BTUARTCONSOLE
+options KGDB_DEVNAME="\"btuart\"" # ffuart or btuart
+options KGDB_DEVRATE=115200
+
+#aupxa0 at pxaip? # AC97 interface
+
+# CF (pcmcia) support
+pxapcic0 at pxaip?
+pcmcia* at pxapcic?
+wi* at pcmcia?
+wdc* at pcmcia?
+
+# IDE hard drives
+wd0 at wdc? flags 0x0000
+wd* at wdc? flags 0x0000
+
+
+# On-board device support
+obio0 at pxaip? intr 8
+#sm0 at obio? addr 0x0c000000 intr 3 # on-board SMC 91C96
+#options LUBBOCK_SMC91C96_16BIT
+
+# LCD
+lcd0 at obio?
+wsdisplay* at lcd? console ?
+options WSEMUL_VT100 # VT100 / VT220 emulation
+
+# Pseudo-Devices
+#pseudo-device wsmux 2 # mouse & keyboard multiplexor
+pseudo-device crypto 1
diff --git a/sys/arch/zaurus/conf/Makefile.zaurus b/sys/arch/zaurus/conf/Makefile.zaurus
new file mode 100644
index 00000000000..0f56943df22
--- /dev/null
+++ b/sys/arch/zaurus/conf/Makefile.zaurus
@@ -0,0 +1,223 @@
+# $OpenBSD: Makefile.zaurus,v 1.1 2004/12/31 00:04:35 drahn Exp $
+# $OpenBSD: Makefile.zaurus,v 1.1 2004/12/31 00:04:35 drahn Exp $
+# $NetBSD: Makefile.i386,v 1.67 1996/05/11 16:12:11 mycroft Exp $
+
+# Makefile for OpenBSD
+#
+# This makefile is constructed from a machine description:
+# config machineid
+# Most changes should be made in the machine description
+# /sys/arch/zaurus/conf/``machineid''
+# after which you should do
+# config machineid
+# Machine generic makefile changes should be made in
+# /sys/arch/zaurus/conf/Makefile.zaurus
+# after which config should be rerun for all machines of that type.
+#
+# N.B.: NO DEPENDENCIES ON FOLLOWING FLAGS ARE VISIBLE TO MAKEFILE
+# IF YOU CHANGE THE DEFINITION OF ANY OF THESE RECOMPILE EVERYTHING
+#
+# -DTRACE compile in kernel tracing hooks
+# -DQUOTA compile in file system quotas
+
+# DEBUG is set to -g if debugging.
+# PROF is set to -pg if profiling.
+
+.include <bsd.own.mk>
+
+MKDEP?= mkdep
+SIZE?= size
+STRIP?= strip
+
+# source tree is located via $S relative to the compilation directory
+.ifndef S
+S!= cd ../../../..; pwd
+.endif
+THISARM= $S/arch/zaurus
+ARM= $S/arch/arm
+
+INCLUDES= -nostdinc -I. -I$S/arch -I$S
+CPPFLAGS= ${INCLUDES} ${IDENT} -D_KERNEL -D__zaurus__
+CDIAGFLAGS= -Werror -Wall -Wstrict-prototypes -Wmissing-prototypes \
+ -Wno-uninitialized -Wno-format -Wno-main
+
+CMACHFLAGS= -ffreestanding
+#CMACHFLAGS= -march=armv4 -mtune=strongarm -ffreestanding
+.if ${IDENT:M-DNO_PROPOLICE}
+CMACHFLAGS+= -fno-stack-protector
+.endif
+CMACHFLAGS+= -msoft-float -fno-builtin-printf -fno-builtin-log
+
+COPTS?= -O2
+CFLAGS= ${DEBUG} ${CDIAGFLAGS} ${CMACHFLAGS} ${COPTS} ${PIPE}
+AFLAGS= -x assembler-with-cpp -D_LOCORE ${CMACHFLAGS}
+#LINKFLAGS= -Ttext 0xF0000020 -e start --warn-common
+#LINKFLAGS= -T ${THISARM}/conf/kern.ldscript
+LINKFLAGS= -T ldscript
+LINKFLAGS+= --warn-common
+STRIPFLAGS= -g -X -x
+
+HOSTCC= ${CC}
+HOSTED_CPPFLAGS=${CPPFLAGS:S/^-nostdinc$//}
+HOSTED_CFLAGS= ${CFLAGS}
+
+### find out what to use for libkern
+.include "$S/lib/libkern/Makefile.inc"
+.ifndef PROF
+LIBKERN= ${KERNLIB}
+.else
+LIBKERN= ${KERNLIB_PROF}
+.endif
+
+### find out what to use for libcompat
+.include "$S/compat/common/Makefile.inc"
+.ifndef PROF
+LIBCOMPAT= ${COMPATLIB}
+.else
+LIBCOMPAT= ${COMPATLIB_PROF}
+.endif
+
+# compile rules: rules are named ${TYPE}_${SUFFIX}${CONFIG_DEP}
+# where TYPE is NORMAL, DRIVER, or PROFILE; SUFFIX is the file suffix,
+# capitalized (e.g. C for a .c file), and CONFIG_DEP is _C if the file
+# is marked as config-dependent.
+
+NORMAL_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c $<
+NORMAL_C_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} ${PARAM} -c $<
+
+DRIVER_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c $<
+DRIVER_C_C= ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} ${PARAM} -c $<
+
+NORMAL_S= ${CC} ${AFLAGS} ${CPPFLAGS} -c $<
+NORMAL_S_C= ${CC} ${AFLAGS} ${CPPFLAGS} ${PARAM} -c $<
+
+HOSTED_C= ${HOSTCC} ${HOSTED_CFLAGS} ${HOSTED_CPPFLAGS} -c $<
+
+%OBJS
+
+%CFILES
+
+%SFILES
+
+# load lines for config "xxx" will be emitted as:
+# xxx: ${SYSTEM_DEP} swapxxx.o
+# ${SYSTEM_LD_HEAD}
+# ${SYSTEM_LD} swapxxx.o
+# ${SYSTEM_LD_TAIL}
+SYSTEM_OBJ= ${BOARDTYPE}_start.o locore.o \
+ param.o ioconf.o ${OBJS} ${LIBKERN} ${LIBCOMPAT}
+SYSTEM_DEP= Makefile ${SYSTEM_OBJ}
+SYSTEM_LD_HEAD= rm -f $@
+SYSTEM_LD_HEAD+=; \
+ ( cat ${ARM}/conf/ldscript.head ;\
+ cat ${ARM}/conf/ldscript.tail ) | \
+ sed -e 's/@KERNEL_BASE_PHYS@/${KERNEL_BASE_PHYS}/' \
+ -e 's/@KERNEL_BASE_VIRT@/${KERNEL_BASE_VIRT}/' \
+ > ldscript
+
+SYSTEM_LD= @echo ${LD} ${LINKFLAGS} -o $@ '$${SYSTEM_OBJ}' vers.o; \
+ ${LD} ${LINKFLAGS} -o $@ ${SYSTEM_OBJ} vers.o
+SYSTEM_LD_TAIL= @${SIZE} $@; chmod 755 $@
+
+DEBUG?=
+.if ${DEBUG} == "-g"
+LINKFLAGS+= -X
+SYSTEM_LD_TAIL+=; \
+ echo cp $@ $@.gdb; rm -f $@.gdb; cp $@ $@.gdb; \
+ echo ${STRIP} ${STRIPFLAGS} $@; ${STRIP} ${STRIPFLAGS} $@
+.else
+LINKFLAGS+= -x
+.endif
+
+%LOAD
+
+assym.h: $S/kern/genassym.sh ${ARM}/arm/genassym.cf Makefile
+ cat ${ARM}/arm/genassym.cf | \
+ sh $S/kern/genassym.sh ${CC} ${CFLAGS} \
+ ${CPPFLAGS} ${PARAM} > assym.h.tmp && \
+ mv -f assym.h.tmp assym.h
+
+param.c: $S/conf/param.c
+ rm -f param.c
+ cp $S/conf/param.c .
+
+param.o: param.c Makefile
+ ${NORMAL_C_C}
+
+ioconf.o: ioconf.c
+ ${NORMAL_C}
+
+newvers: ${SYSTEM_DEP} ${SYSTEM_SWAP_DEP}
+ sh $S/conf/newvers.sh
+ ${CC} ${CFLAGS} ${CPPFLAGS} ${PROF} -c vers.c
+
+
+clean::
+ rm -f eddep *bsd bsd.gdb tags *.[io] [a-z]*.s \
+ [Ee]rrs linterrs makelinks assym.h
+
+lint:
+ @lint -hbxncez -Dvolatile= ${CPPFLAGS} ${PARAM} -UKGDB \
+ ${CFILES} ioconf.c param.c | \
+ grep -v 'static function .* unused'
+
+tags:
+ @echo "see $S/kern/Makefile for tags"
+
+links:
+ egrep '#if' ${CFILES} | sed -f $S/conf/defines | \
+ sed -e 's/:.*//' -e 's/\.c/.o/' | sort -u > dontlink
+ echo ${CFILES} | tr -s ' ' '\12' | sed 's/\.c/.o/' | \
+ sort -u | comm -23 - dontlink | \
+ sed 's,.*/\(.*.o\),rm -f \1; ln -s ../GENERIC/\1 \1,' > makelinks
+ sh makelinks && rm -f dontlink makelinks
+
+SRCS= ${ARM}/arm/locore.S ${ARM}/arm/locore.S \
+ param.c ioconf.c ${CFILES} ${SFILES}
+depend:: .depend
+.depend: ${SRCS} assym.h param.c ${APMINC}
+ ${MKDEP} ${AFLAGS} ${CPPFLAGS} ${ARM}/arm/locore.S
+ ${MKDEP} -a ${CFLAGS} ${CPPFLAGS} param.c ioconf.c ${CFILES}
+ ${MKDEP} -a ${AFLAGS} ${CPPFLAGS} ${SFILES}
+ cat ${ARM}/arm/genassym.cf ${ARM}/footbridge/genassym.cf | \
+ sh $S/kern/genassym.sh ${MKDEP} -f assym.dep ${CFLAGS} \
+ ${CPPFLAGS}
+ @sed -e 's/.*\.o:.* /assym.h: /' < assym.dep >> .depend
+ @rm -f assym.dep
+
+
+# depend on root or device configuration
+autoconf.o conf.o: Makefile
+
+# depend on network or filesystem configuration
+uipc_domain.o uipc_proto.o vfs_conf.o: Makefile
+if.o if_tun.o if_loop.o if_ethersubr.o: Makefile
+if_arp.o if_ether.o: Makefile
+ip_input.o ip_output.o in_pcb.o in_proto.o: Makefile
+tcp_subr.o tcp_timer.o tcp_output.o: Makefile
+
+# depend on maxusers
+machdep.o: Makefile
+
+# depend on CPU configuration
+locore.o machdep.o: Makefile
+
+${BOARDTYPE}_start.o: ${THISARM}/zaurus/${BOARDTYPE}_start.S assym.h
+ ${NORMAL_S}
+
+locore.o: ${ARM}/arm/locore.S assym.h
+ ${NORMAL_S}
+
+# The install target can be redefined by putting a
+# install-kernel-${MACHINE_NAME} target into /etc/mk.conf
+MACHINE_NAME!= uname -n
+install: install-kernel-${MACHINE_NAME}
+.if !target(install-kernel-${MACHINE_NAME}})
+install-kernel-${MACHINE_NAME}:
+ rm -f /obsd
+ ln /bsd /obsd
+ cp bsd /nbsd
+ mv /nbsd /bsd
+.endif
+
+%RULES
diff --git a/sys/arch/zaurus/conf/RAMDISK b/sys/arch/zaurus/conf/RAMDISK
new file mode 100644
index 00000000000..1addfc790ca
--- /dev/null
+++ b/sys/arch/zaurus/conf/RAMDISK
@@ -0,0 +1,141 @@
+# $OpenBSD: RAMDISK,v 1.1 2004/12/31 00:04:35 drahn Exp $
+# $NetBSD: GENERIC,v 1.27.4.1 2002/08/01 04:18:06 lukem Exp $
+#
+# GENERIC machine description file
+#
+# This machine description file is used to generate the default OpenBSD
+# kernel. The generic kernel does not include all options, subsystems
+# and device drivers, but should be useful for most applications.
+#
+# The machine description file can be customised for your specific
+# machine to reduce the kernel size and improve its performance.
+#
+# For further information on compiling OpenBSD kernels, see the config(8)
+# man page.
+#
+# For further information on hardware support for this architecture, see
+# the intro(4) man page. For further information about kernel options
+# for this architecture, see the options(4) man page. For an explanation
+# of each device driver in this file see the section 4 man page for the
+# device.
+
+machine zaurus arm
+
+# include "../../../conf/GENERIC"
+option TIMEZONE=0 # time zone to adjust RTC time by
+option DST=0 # daylight saving time used by RTC
+option COMPAT_43 # and 4.3BSD
+option FFS # UFS
+#option NFSCLIENT # Network File System client
+option CD9660 # ISO 9660 + Rock Ridge file system
+option MSDOSFS # MS-DOS file system
+option INET # IP + ICMP + TCP + UDP
+option INET6 # IPv6 (needs INET)
+option DDB # kernel debugger
+option EXT2FS # Second Extended Filesystem
+option FIFO # FIFOs; RECOMMENDED
+
+options ARM32
+#options ARM_INTR_IMPL="<arch/arm/xscale/pxa2x0_intr.h>"
+options PXA2x0_INTR
+options COTULLA
+options LUBBOCK
+options PXAGPIO_HAS_GPION_INTRS
+
+options CACHE_CLEAN_BLOCK_INTR
+
+makeoptions KERNEL_BASE_PHYS="0xa0200000"
+makeoptions KERNEL_BASE_VIRT="0xc0200000"
+makeoptions BOARDTYPE="zaurus"
+
+# estimated number of users
+
+maxusers 32
+
+# Standard system options
+
+#options UCONSOLE # users can use TIOCCONS (for xconsole)
+#options INSECURE # disable kernel securelevel
+
+#options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT
+#options NTP # NTP phase/frequency locked loop
+
+# CPU options
+
+# For StrongARM systems
+# CPU options
+options CPU_XSCALE_PXA2X0 # Support the XScale core
+options XSCALE_CACHE_WRITE_THROUGH
+#options XSCALE_CACHE_WRITE_BACK
+makeoptions CPUFLAGS="-mcpu=xscale"
+
+options SYSCALL_DEBUG
+
+# FPA options
+
+#options ARMFPE # ARM Ltd FPE
+
+#option WSDISPLAY_COMPAT_USL # VT handling
+#option WSDISPLAY_COMPAT_RAWKBD # can get raw scancodes
+#option WSDISPLAY_DEFAULTSCREENS=6 # can get raw scancodes
+#option WSDISPLAY_COMPAT_PCVT # can get raw scancodes
+
+#config bsd swap generic
+config bsd root on rd0a swap on rd0b
+
+# The main bus device
+mainbus0 at root
+cpu0 at mainbus?
+pxaip0 at mainbus?
+
+pxaintc0 at pxaip? # interrupt controller
+pxagpio0 at pxaip? # GPIO
+saost0 at pxaip? addr 0x40a00000 size 0x20
+
+# cotulla integrated 16550 UARTs
+options COM_PXA2X0
+com0 at pxaip? addr 0x40100000 intr 22 # Full Function UART
+com1 at pxaip? addr 0x40200000 intr 21 # BlueTootth UART
+#com2 at pxaip? addr 0x40700000 intr 20 # Standard UART (for IrDA)
+options FFUARTCONSOLE
+#options BTUARTCONSOLE
+options KGDB_DEVNAME="\"btuart\"" # ffuart or btuart
+options KGDB_DEVRATE=115200
+
+#aupxa0 at pxaip? # AC97 interface
+
+
+# pcic
+pxapcic0 at pxaip?
+pcmcia* at pxapcic?
+wi* at pcmcia?
+wdc* at pcmcia?
+
+# IDE hard drives
+wd* at wdc? flags 0x0000
+
+# On-board device support
+obio0 at pxaip? intr 8
+#sm0 at obio? addr 0x0c000000 intr 3 # on-board SMC 91C96
+#options LUBBOCK_SMC91C96_16BIT
+
+# LCD
+lcd0 at obio?
+wsdisplay* at lcd? console ?
+options WSEMUL_VT100 # VT100 / VT220 emulation
+
+
+# Pseudo-Devices
+#pseudo-device wsmux 2 # mouse & keyboard multiplexor
+#pseudo-device crypto 1
+pseudo-device loop 1 # network loopback
+pseudo-device bpfilter 1 # packet filter
+pseudo-device rd 1 # ram disk
+
+option BOOT_CONFIG # boot-time kernel config
+
+# RAMDISK stuff
+#option MINIROOTSIZE=8192
+option MINIROOTSIZE=5120
+option RAMDISK_HOOKS
+
diff --git a/sys/arch/zaurus/conf/files.zaurus b/sys/arch/zaurus/conf/files.zaurus
new file mode 100644
index 00000000000..d7bb17ff9f7
--- /dev/null
+++ b/sys/arch/zaurus/conf/files.zaurus
@@ -0,0 +1,81 @@
+# $NetBSD: files.pxaarm,v 1.17 2003/02/17 20:51:53 ichiro Exp $
+#
+# First try for arm-specific configuration info
+#
+
+maxpartitions 8
+maxusers 2 8 64
+
+include "../../../scsi/files.scsi"
+include "../../../dev/atapiscsi/files.atapiscsi"
+major {wd = 16}
+major {sd = 24}
+major {cd = 26}
+major {rd = 18}
+
+file arch/arm/arm/conf.c
+
+file arch/zaurus/zaurus/zaurus_machdep.c
+
+# CPU support and integrated peripherals
+include "arch/arm/xscale/files.pxa2x0"
+
+# LUBBOCK on-board devices (including CPLD)
+device obio {[addr = -1], [size = -1], [width = -1], [intr = -1]}: bus_space_generic
+attach obio at pxaip
+file arch/zaurus/zaurus/obio.c obio
+
+#device sacpcic: pcmciabus
+#attach sacpcic at sacc
+#file arch/arm/sa11x0/sa11x1_pcic.c sacpcic needs-flag
+#file arch/arm/sa11x0/sa11xx_pcic.c sacpcic
+#file arch/zaurus/zaurus/zaurus_pcic.c sacpcic
+
+
+# LCD frame buffer
+attach lcd at obio with lcd_obio
+file arch/zaurus/zaurus/zaurus_lcd.c lcd_obio
+
+#
+# Machine-independent ATA drivers
+#
+include "dev/ata/files.ata"
+
+#
+# Machine-independent SCSI drivers
+#
+
+
+# Generic MD files
+file arch/zaurus/zaurus/autoconf.c
+
+file arch/arm/arm/disksubr.c disk
+
+# ARM FPE
+file arch/arm/fpe-arm/armfpe_glue.S armfpe
+file arch/arm/fpe-arm/armfpe_init.c armfpe
+file arch/arm/fpe-arm/armfpe.s armfpe
+
+# Machine-independent I2O drivers.
+include "dev/i2o/files.i2o"
+
+#
+# Include PCI config
+#
+include "dev/mii/files.mii"
+include "dev/pci/files.pci"
+
+device pcib: isabus
+attach pcib at pci
+file arch/zaurus/pci/pcib.c pcib
+
+file arch/zaurus/pci/pciide_machdep.c pciide
+
+# Include USB stuff
+include "dev/usb/files.usb"
+
+# Include WSCONS stuff
+include "dev/wscons/files.wscons"
+include "dev/rasops/files.rasops"
+include "dev/wsfont/files.wsfont"
+include "dev/pckbc/files.pckbc"
diff --git a/sys/arch/zaurus/include/ansi.h b/sys/arch/zaurus/include/ansi.h
new file mode 100644
index 00000000000..e36aebf137b
--- /dev/null
+++ b/sys/arch/zaurus/include/ansi.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ansi.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: ansi.h,v 1.3 2001/11/25 15:55:54 thorpej Exp $ */
+
+#include <arm/ansi.h>
diff --git a/sys/arch/zaurus/include/asm.h b/sys/arch/zaurus/include/asm.h
new file mode 100644
index 00000000000..f903110011e
--- /dev/null
+++ b/sys/arch/zaurus/include/asm.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: asm.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: asm.h,v 1.3 2001/11/25 15:55:54 thorpej Exp $ */
+
+#include <arm/asm.h>
diff --git a/sys/arch/zaurus/include/atomic.h b/sys/arch/zaurus/include/atomic.h
new file mode 100644
index 00000000000..afa16a53ab9
--- /dev/null
+++ b/sys/arch/zaurus/include/atomic.h
@@ -0,0 +1,2 @@
+/* $OpenBSD: atomic.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+#include <arm/atomic.h>
diff --git a/sys/arch/zaurus/include/bootconfig.h b/sys/arch/zaurus/include/bootconfig.h
new file mode 100644
index 00000000000..559ab2d491d
--- /dev/null
+++ b/sys/arch/zaurus/include/bootconfig.h
@@ -0,0 +1,76 @@
+/* $OpenBSD: bootconfig.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: bootconfig.h,v 1.2 2001/06/21 22:08:28 chris Exp $ */
+
+/*
+ * Copyright (c) 1994 Mark Brinicombe.
+ * Copyright (c) 1994 Brini.
+ * All rights reserved.
+ *
+ * This code is derived from software written for Brini by Mark Brinicombe
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Mark Brinicombe
+ * for the NetBSD Project.
+ * 4. The name of the company nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * boot configuration structures
+ *
+ * Created : 12/09/94
+ *
+ * Based on kate/boot/bootconfig.h
+ */
+
+typedef struct _PhysMem {
+ u_int address;
+ u_int pages;
+} PhysMem;
+
+#if defined(_KERNEL)
+
+#define DRAM_BLOCKS 1
+
+typedef struct _BootConfig {
+ PhysMem dram[DRAM_BLOCKS];
+ u_int dramblocks;
+} BootConfig;
+
+extern BootConfig bootconfig;
+#define MAX_BOOT_STRING 255
+
+#define BOOTOPT_TYPE_BOOLEAN 0
+#define BOOTOPT_TYPE_STRING 1
+#define BOOTOPT_TYPE_INT 2
+#define BOOTOPT_TYPE_BININT 3
+#define BOOTOPT_TYPE_HEXINT 4
+#define BOOTOPT_TYPE_MASK 7
+
+int get_bootconf_option (char *string, char *option, int type, void *result);
+
+extern char *boot_args;
+extern char *boot_file;
+#endif /* _KERNEL */
+
+/* End of bootconfig.h */
diff --git a/sys/arch/zaurus/include/bus.h b/sys/arch/zaurus/include/bus.h
new file mode 100644
index 00000000000..9f40a4cfa47
--- /dev/null
+++ b/sys/arch/zaurus/include/bus.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: bus.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: bus.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/bus.h>
diff --git a/sys/arch/zaurus/include/cdefs.h b/sys/arch/zaurus/include/cdefs.h
new file mode 100644
index 00000000000..32afc645781
--- /dev/null
+++ b/sys/arch/zaurus/include/cdefs.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: cdefs.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: cdefs.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/cdefs.h>
diff --git a/sys/arch/zaurus/include/conf.h b/sys/arch/zaurus/include/conf.h
new file mode 100644
index 00000000000..267b621bfe7
--- /dev/null
+++ b/sys/arch/zaurus/include/conf.h
@@ -0,0 +1,19 @@
+/* $OpenBSD: conf.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: conf.h,v 1.8 2002/02/10 12:26:03 chris Exp $ */
+
+#ifndef _CATS_CONF_H
+#define _CATS_CONF_H
+
+/*
+ * CATS specific device includes go in here
+ */
+#include "fcom.h"
+
+#define CONF_HAVE_PCI
+#define CONF_HAVE_USB
+#define CONF_HAVE_SCSIPI
+#define CONF_HAVE_WSCONS
+
+#include <arm/conf.h>
+
+#endif /* _CATS_CONF_H */
diff --git a/sys/arch/zaurus/include/cpu.h b/sys/arch/zaurus/include/cpu.h
new file mode 100644
index 00000000000..b5b491a79f7
--- /dev/null
+++ b/sys/arch/zaurus/include/cpu.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: cpu.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: cpu.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/cpu.h>
diff --git a/sys/arch/zaurus/include/db_machdep.h b/sys/arch/zaurus/include/db_machdep.h
new file mode 100644
index 00000000000..45324563408
--- /dev/null
+++ b/sys/arch/zaurus/include/db_machdep.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: db_machdep.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: db_machdep.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/db_machdep.h>
diff --git a/sys/arch/zaurus/include/disklabel.h b/sys/arch/zaurus/include/disklabel.h
new file mode 100644
index 00000000000..7e63a238746
--- /dev/null
+++ b/sys/arch/zaurus/include/disklabel.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: disklabel.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: disklabel.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/disklabel.h>
diff --git a/sys/arch/zaurus/include/elf_abi.h b/sys/arch/zaurus/include/elf_abi.h
new file mode 100644
index 00000000000..3104811209b
--- /dev/null
+++ b/sys/arch/zaurus/include/elf_abi.h
@@ -0,0 +1,3 @@
+/* $OpenBSD: elf_abi.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+
+#include <arm/elf_abi.h>
diff --git a/sys/arch/zaurus/include/endian.h b/sys/arch/zaurus/include/endian.h
new file mode 100644
index 00000000000..81a63fd780c
--- /dev/null
+++ b/sys/arch/zaurus/include/endian.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: endian.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: endian.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/endian.h>
diff --git a/sys/arch/zaurus/include/exec.h b/sys/arch/zaurus/include/exec.h
new file mode 100644
index 00000000000..b20dfdbaaf7
--- /dev/null
+++ b/sys/arch/zaurus/include/exec.h
@@ -0,0 +1,48 @@
+/* $OpenBSD: exec.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: exec.h,v 1.6 1994/10/27 04:16:05 cgd Exp $ */
+
+/*
+ * Copyright (c) 1993 Christopher G. Demetriou
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _I386_EXEC_H_
+#define _I386_EXEC_H_
+
+#define __LDPGSZ 4096
+
+#define NATIVE_EXEC_ELF
+
+#define ARCH_ELFSIZE 32
+
+#define ELF_TARG_CLASS ELFCLASS32
+#define ELF_TARG_DATA ELFDATA2LSB
+#define ELF_TARG_MACH EM_ARM
+
+#define _NLIST_DO_ELF
+
+#define _KERN_DO_ELF
+
+#endif /* _I386_EXEC_H_ */
diff --git a/sys/arch/zaurus/include/float.h b/sys/arch/zaurus/include/float.h
new file mode 100644
index 00000000000..1b6ce4f7b2b
--- /dev/null
+++ b/sys/arch/zaurus/include/float.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: float.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: float.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/float.h>
diff --git a/sys/arch/zaurus/include/fp.h b/sys/arch/zaurus/include/fp.h
new file mode 100644
index 00000000000..2a8d6cc460c
--- /dev/null
+++ b/sys/arch/zaurus/include/fp.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: fp.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: fp.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/fp.h>
diff --git a/sys/arch/zaurus/include/frame.h b/sys/arch/zaurus/include/frame.h
new file mode 100644
index 00000000000..d96c1961dda
--- /dev/null
+++ b/sys/arch/zaurus/include/frame.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: frame.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: frame.h,v 1.1 2001/06/08 22:23:00 chris Exp $ */
+
+#include <arm/frame.h>
diff --git a/sys/arch/zaurus/include/ieee.h b/sys/arch/zaurus/include/ieee.h
new file mode 100644
index 00000000000..ed711e4e217
--- /dev/null
+++ b/sys/arch/zaurus/include/ieee.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ieee.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: ieee.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/ieee.h>
diff --git a/sys/arch/zaurus/include/ieeefp.h b/sys/arch/zaurus/include/ieeefp.h
new file mode 100644
index 00000000000..3b0165dc66a
--- /dev/null
+++ b/sys/arch/zaurus/include/ieeefp.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ieeefp.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: ieeefp.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/ieeefp.h>
diff --git a/sys/arch/zaurus/include/internal_types.h b/sys/arch/zaurus/include/internal_types.h
new file mode 100644
index 00000000000..03f5d7caf10
--- /dev/null
+++ b/sys/arch/zaurus/include/internal_types.h
@@ -0,0 +1,7 @@
+/* $OpenBSD: internal_types.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* Public domain */
+#ifndef _MACHINE_INTERNAL_TYPES_H_
+#define _MACHINE_INTERNAL_TYPES_H_
+
+#include "arm/internal_types.h"
+#endif
diff --git a/sys/arch/zaurus/include/intr.h b/sys/arch/zaurus/include/intr.h
new file mode 100644
index 00000000000..75291e36ade
--- /dev/null
+++ b/sys/arch/zaurus/include/intr.h
@@ -0,0 +1,159 @@
+
+/* $NetBSD: intr.h,v 1.12 2003/06/16 20:00:59 thorpej Exp $ */
+
+/*
+ * Copyright (c) 2001, 2003 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _EVBARM_INTR_H_
+#define _EVBARM_INTR_H_
+
+#ifdef _KERNEL
+
+
+/* Interrupt priority "levels". */
+#define IPL_NONE 0 /* nothing */
+#define IPL_SOFT 1 /* generic software interrupts */
+#define IPL_SOFTCLOCK 2 /* software clock interrupt */
+#define IPL_SOFTNET 3 /* software network interrupt */
+#define IPL_BIO 4 /* block I/O */
+#define IPL_NET 5 /* network */
+#define IPL_SOFTSERIAL 6 /* software serial interrupt */
+#define IPL_TTY 7 /* terminals */
+#define IPL_VM 8 /* memory allocation */
+#define IPL_AUDIO 9 /* audio device */
+#define IPL_CLOCK 10 /* clock interrupt */
+#define IPL_STATCLOCK 11 /* statistics clock interrupt */
+#define IPL_HIGH 12 /* everything */
+#define IPL_SERIAL 13 /* serial device */
+
+#define NIPL 14
+
+/* Interrupt sharing types. */
+#define IST_NONE 0 /* none */
+#define IST_PULSE 1 /* pulsed */
+#define IST_EDGE 2 /* edge-triggered */
+#define IST_LEVEL 3 /* level-triggered */
+
+#define IST_LEVEL_LOW IST_LEVEL
+#define IST_LEVEL_HIGH 4
+#define IST_EDGE_FALLING IST_EDGE
+#define IST_EDGE_RISING 5
+#define IST_EDGE_BOTH 6
+
+
+#define __NEWINTR /* enables new hooks in cpu_fork()/cpu_switch() */
+
+#ifndef _LOCORE
+
+#include <sys/device.h>
+#include <sys/queue.h>
+
+#if defined(_LKM)
+
+int _splraise(int);
+int _spllower(int);
+void splx(int);
+void _setsoftintr(int);
+
+#else /* _LKM */
+
+/*
+ * Each board needs to define the following functions:
+ *
+ * int _splraise(int);
+ * int _spllower(int);
+ * void splx(int);
+ * void _setsoftintr(int);
+ *
+ * These may be defined as functions, static __inline functions, or macros,
+ * but there must be a _spllower() and splx() defined as functions callable
+ * from assembly language (for cpu_switch()). However, since it's quite
+ * useful to be able to inline splx(), you could do something like the
+ * following:
+ *
+ * in <boardtype>_intr.h:
+ * static __inline int
+ * boardtype_splx(int spl)
+ * {...}
+ *
+ * #define splx(nspl) boardtype_splx(nspl)
+ * ...
+ * and in boardtype's machdep code:
+ *
+ * ...
+ * #undef splx
+ * int
+ * splx(int spl)
+ * {
+ * return boardtype_splx(spl);
+ * }
+ */
+
+/* XXX */
+#include <arm/xscale/pxa2x0_intr.h>
+
+#endif /* _LKM */
+
+#define splhigh() _splraise(IPL_HIGH)
+#define splsoft() _splraise(IPL_SOFT)
+#define splsoftclock() _splraise(IPL_SOFTCLOCK)
+#define splsoftnet() _splraise(IPL_SOFTNET)
+#define splbio() _splraise(IPL_BIO)
+#define splnet() _splraise(IPL_NET)
+#define spltty() _splraise(IPL_TTY)
+#define splimp() _splraise(IPL_VM)
+#define splvm() _splraise(IPL_VM)
+#define splaudio() _splraise(IPL_AUDIO)
+#define splclock() _splraise(IPL_CLOCK)
+#define splstatclock() _splraise(IPL_STATCLOCK)
+#define splserial() _splraise(IPL_SERIAL)
+
+#define spl0() _spllower(IPL_NONE)
+#define spllowersoftclock() _spllower(IPL_SOFTCLOCK)
+
+#define splsched() splhigh()
+#define spllock() splhigh()
+
+/* Use generic software interrupt support. */
+#include <arm/softintr.h>
+
+#endif /* ! _LOCORE */
+
+#define splassert(wantipl) do { /* nada */ } while (0)
+
+#endif /* _KERNEL */
+
+#endif /* _EVBARM_INTR_H_ */
+
diff --git a/sys/arch/zaurus/include/irqhandler.h b/sys/arch/zaurus/include/irqhandler.h
new file mode 100644
index 00000000000..a10bebe9e55
--- /dev/null
+++ b/sys/arch/zaurus/include/irqhandler.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: irqhandler.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: irqhandler.h,v 1.4 2002/04/12 18:50:32 thorpej Exp $ */
+
+#include <arm/footbridge/footbridge_irqhandler.h>
diff --git a/sys/arch/zaurus/include/isa_machdep.h b/sys/arch/zaurus/include/isa_machdep.h
new file mode 100644
index 00000000000..ed44d88af37
--- /dev/null
+++ b/sys/arch/zaurus/include/isa_machdep.h
@@ -0,0 +1,13 @@
+/* $OpenBSD: isa_machdep.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: isa_machdep.h,v 1.4 2002/01/07 22:58:08 chris Exp $ */
+
+#ifndef _CATS_ISA_MACHDEP_H_
+#define _CATS_ISA_MACHDEP_H_
+#include <arm/isa_machdep.h>
+
+#ifdef _KERNEL
+#define ISA_FOOTBRIDGE_IRQ IRQ_IN_L2
+void isa_footbridge_init(u_int, u_int);
+#endif /* _KERNEL */
+
+#endif /* _CATS_ISA_MACHDEP_H_ */
diff --git a/sys/arch/zaurus/include/limits.h b/sys/arch/zaurus/include/limits.h
new file mode 100644
index 00000000000..c3a60dbab4e
--- /dev/null
+++ b/sys/arch/zaurus/include/limits.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: limits.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: limits.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/limits.h>
diff --git a/sys/arch/zaurus/include/lock.h b/sys/arch/zaurus/include/lock.h
new file mode 100644
index 00000000000..8d51954acb2
--- /dev/null
+++ b/sys/arch/zaurus/include/lock.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: lock.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: lock.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/lock.h>
diff --git a/sys/arch/zaurus/include/math.h b/sys/arch/zaurus/include/math.h
new file mode 100644
index 00000000000..585c4f9b181
--- /dev/null
+++ b/sys/arch/zaurus/include/math.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: math.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: math.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/math.h>
diff --git a/sys/arch/zaurus/include/param.h b/sys/arch/zaurus/include/param.h
new file mode 100644
index 00000000000..fc088830628
--- /dev/null
+++ b/sys/arch/zaurus/include/param.h
@@ -0,0 +1,51 @@
+/* $OpenBSD: param.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: param.h,v 1.4 2002/02/12 06:58:19 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1994,1995 Mark Brinicombe.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the RiscBSD team.
+ * 4. The name "RiscBSD" nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY RISCBSD ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL RISCBSD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _CATS_PARAM_H_
+#define _CATS_PARAM_H_
+
+/*
+ * cats boot dmesg is bigger than 4k
+ */
+#ifndef MSGBUFSIZE
+#define MSGBUFSIZE (2*NBPG)
+#endif
+
+#include <arm/param.h>
+
+#define _MACHINE cats
+#define MACHINE "cats"
+
+#endif /* _CATS_PARAM_H_ */
diff --git a/sys/arch/zaurus/include/pcb.h b/sys/arch/zaurus/include/pcb.h
new file mode 100644
index 00000000000..63455769a68
--- /dev/null
+++ b/sys/arch/zaurus/include/pcb.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: pcb.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: pcb.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/pcb.h>
diff --git a/sys/arch/zaurus/include/pio.h b/sys/arch/zaurus/include/pio.h
new file mode 100644
index 00000000000..e34d5fecf16
--- /dev/null
+++ b/sys/arch/zaurus/include/pio.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: pio.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: pio.h,v 1.3 2001/12/07 23:09:33 chris Exp $ */
+
+#include <arm/pio.h>
diff --git a/sys/arch/zaurus/include/pmap.h b/sys/arch/zaurus/include/pmap.h
new file mode 100644
index 00000000000..fd34a3faf73
--- /dev/null
+++ b/sys/arch/zaurus/include/pmap.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: pmap.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: pmap.h,v 1.2 2001/11/23 17:29:01 thorpej Exp $ */
+
+#include <arm/pmap.h>
diff --git a/sys/arch/zaurus/include/proc.h b/sys/arch/zaurus/include/proc.h
new file mode 100644
index 00000000000..e9eea6e2344
--- /dev/null
+++ b/sys/arch/zaurus/include/proc.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: proc.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: proc.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/proc.h>
diff --git a/sys/arch/zaurus/include/profile.h b/sys/arch/zaurus/include/profile.h
new file mode 100644
index 00000000000..00ae54f7809
--- /dev/null
+++ b/sys/arch/zaurus/include/profile.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: profile.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: profile.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/profile.h>
diff --git a/sys/arch/zaurus/include/psl.h b/sys/arch/zaurus/include/psl.h
new file mode 100644
index 00000000000..b56f54b0dc4
--- /dev/null
+++ b/sys/arch/zaurus/include/psl.h
@@ -0,0 +1 @@
+/* $OpenBSD: psl.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
diff --git a/sys/arch/zaurus/include/ptrace.h b/sys/arch/zaurus/include/ptrace.h
new file mode 100644
index 00000000000..3bfe7543665
--- /dev/null
+++ b/sys/arch/zaurus/include/ptrace.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ptrace.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: ptrace.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/ptrace.h>
diff --git a/sys/arch/zaurus/include/reg.h b/sys/arch/zaurus/include/reg.h
new file mode 100644
index 00000000000..fc06d65ede7
--- /dev/null
+++ b/sys/arch/zaurus/include/reg.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: reg.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: reg.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/reg.h>
diff --git a/sys/arch/zaurus/include/reloc.h b/sys/arch/zaurus/include/reloc.h
new file mode 100644
index 00000000000..3443c31ae4b
--- /dev/null
+++ b/sys/arch/zaurus/include/reloc.h
@@ -0,0 +1,2 @@
+/* $OpenBSD: reloc.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+#include <arm/reloc.h>
diff --git a/sys/arch/zaurus/include/rtc.h b/sys/arch/zaurus/include/rtc.h
new file mode 100644
index 00000000000..e9d41237157
--- /dev/null
+++ b/sys/arch/zaurus/include/rtc.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: rtc.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: rtc.h,v 1.2 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/rtc.h>
diff --git a/sys/arch/zaurus/include/setjmp.h b/sys/arch/zaurus/include/setjmp.h
new file mode 100644
index 00000000000..2dc2a0d57be
--- /dev/null
+++ b/sys/arch/zaurus/include/setjmp.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: setjmp.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: setjmp.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/setjmp.h>
diff --git a/sys/arch/zaurus/include/signal.h b/sys/arch/zaurus/include/signal.h
new file mode 100644
index 00000000000..eb777b91da0
--- /dev/null
+++ b/sys/arch/zaurus/include/signal.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: signal.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: signal.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/signal.h>
diff --git a/sys/arch/zaurus/include/spinlock.h b/sys/arch/zaurus/include/spinlock.h
new file mode 100644
index 00000000000..7fad72549b4
--- /dev/null
+++ b/sys/arch/zaurus/include/spinlock.h
@@ -0,0 +1,6 @@
+
+/* $OpenBSD: spinlock.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+#ifndef _CATS_SPINLOCK_H_
+#define _CATS_SPINLOCK_H_
+#include <arm/spinlock.h>
+#endif _CATS_SPINLOCK_H_
diff --git a/sys/arch/zaurus/include/stdarg.h b/sys/arch/zaurus/include/stdarg.h
new file mode 100644
index 00000000000..ecec78f756b
--- /dev/null
+++ b/sys/arch/zaurus/include/stdarg.h
@@ -0,0 +1,3 @@
+/* $NetBSD: stdarg.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/stdarg.h>
diff --git a/sys/arch/zaurus/include/sysarch.h b/sys/arch/zaurus/include/sysarch.h
new file mode 100644
index 00000000000..3fcdaf85729
--- /dev/null
+++ b/sys/arch/zaurus/include/sysarch.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: sysarch.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: sysarch.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/sysarch.h>
diff --git a/sys/arch/zaurus/include/trap.h b/sys/arch/zaurus/include/trap.h
new file mode 100644
index 00000000000..bbcaa1b8aa4
--- /dev/null
+++ b/sys/arch/zaurus/include/trap.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: trap.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: trap.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/trap.h>
diff --git a/sys/arch/zaurus/include/types.h b/sys/arch/zaurus/include/types.h
new file mode 100644
index 00000000000..70d96cbd4a3
--- /dev/null
+++ b/sys/arch/zaurus/include/types.h
@@ -0,0 +1,11 @@
+/* $OpenBSD: types.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: types.h,v 1.4 2002/02/28 03:17:26 simonb Exp $ */
+
+#ifndef _ARM32_TYPES_H_
+#define _ARM32_TYPES_H_
+
+#include <arm/types.h>
+#define __HAVE_GENERIC_SOFT_INTERRUPTS
+#define __HAVE_NWSCONS
+
+#endif
diff --git a/sys/arch/zaurus/include/vmparam.h b/sys/arch/zaurus/include/vmparam.h
new file mode 100644
index 00000000000..5c757a150ce
--- /dev/null
+++ b/sys/arch/zaurus/include/vmparam.h
@@ -0,0 +1,100 @@
+/* $OpenBSD: vmparam.h,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: vmparam.h,v 1.23 2003/05/22 05:47:07 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1988 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ARM32_VMPARAM_H_
+#define _ARM32_VMPARAM_H_
+
+#define ARM_KERNEL_BASE 0xc0000000
+
+#include <arm/vmparam.h>
+
+#ifdef _KERNEL
+/*
+ * Address space constants
+ */
+
+/*
+ * The line between user space and kernel space
+ * Mappings >= KERNEL_BASE are constant across all processes
+ */
+#define KERNEL_BASE ARM_KERNEL_BASE
+
+/*
+ * Override the default pager_map size, there's not enough KVA.
+ */
+#define PAGER_MAP_SIZE (4 * 1024 * 1024)
+
+/*
+ * Size of User Raw I/O map
+ */
+
+#define USRIOSIZE 300
+
+/* virtual sizes (bytes) for various kernel submaps */
+
+#define VM_PHYS_SIZE (USRIOSIZE*PAGE_SIZE)
+
+/*
+ * max number of non-contig chunks of physical RAM you can have
+ */
+
+#define VM_PHYSSEG_MAX 32
+
+/*
+ * when converting a physical address to a vm_page structure, we
+ * want to use a binary search on the chunks of physical memory
+ * to find our RAM
+ */
+
+#define VM_PHYSSEG_STRAT VM_PSTRAT_BSEARCH
+
+/*
+ * this indicates that we can't add RAM to the VM system after the
+ * vm system is init'd.
+ */
+
+#define VM_PHYSSEG_NOADD
+
+/*
+ * we support 2 free lists:
+ *
+ * - DEFAULT for all systems
+ * - ISADMA for the ISA DMA range on Sharks only
+ */
+#endif /* _KERNEL */
+
+#define VM_NFREELIST 2
+#define VM_FREELIST_DEFAULT 0
+#define VM_FREELIST_ISADMA 1
+
+
+#endif /* _ARM32_VMPARAM_H_ */
diff --git a/sys/arch/zaurus/include/zaurus_reg.h b/sys/arch/zaurus/include/zaurus_reg.h
new file mode 100644
index 00000000000..d40043cf7c8
--- /dev/null
+++ b/sys/arch/zaurus/include/zaurus_reg.h
@@ -0,0 +1,96 @@
+/* $NetBSD: lubbock_reg.h,v 1.1 2003/06/18 10:51:15 bsh Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#ifndef _EVBARM_LUBBOCK_REG_H
+#define _EVBARM_LUBBOCK_REG_H
+
+#include <arm/xscale/pxa2x0reg.h>
+
+/* lubbock on-board IOs */
+#define LUBBOCK_OBIO_PBASE PXA2X0_CS2_START /* Physical address */
+#define LUBBOCK_OBIO_SIZE 0x00000100
+
+#define LUBBOCK_SRAM_PBASE (PXA2X0_CS2_START+0x02000000)
+#define LUBBOCK_SRAM_SIZE 0x00100000
+
+#define LUBBOCK_91C96_PBASE PXA2X0_CS3_START
+#define LUBBOCK_91C96_IO LUBBOCK_91C96_PBASE
+#define LUBBOCK_91C96_ATTRMEM (LUBBOCK_91C96_PBASE+0x02000000)
+
+
+/* SA-1111 companion chip registers */
+#define LUBBOCK_SACC_PBASE PXA2X0_CS4_START
+
+/*
+ * Logical mapping for onboard/integrated peripherals
+ */
+#define LUBBOCK_IO_AREA_VBASE 0xfd000000
+#define LUBBOCK_OBIO_VBASE 0xfd000000
+#define LUBBOCK_GPIO_VBASE 0xfd100000
+#define LUBBOCK_CLKMAN_VBASE 0xfd200000
+#define LUBBOCK_INTCTL_VBASE 0xfd300000
+#define LUBBOCK_AGPIO_VBASE 0xfd400000
+#define LUBBOCK_VBASE_FREE 0xfd500000
+/* FFUART and/or BTUART are mapped to this area when
+ used for console or kgdb port */
+
+/*
+ * Onboard register address
+ * (offset from LUBBOCK_OBIO_PBASE)
+ */
+#define LUBBOCK_SYSTEMID 0x0000
+#define LUBBOCK_HEXLED 0x0010
+#define LUBBOCK_LEDCTL 0x0040
+#define LUBBOCK_CONFIGSW 0x0050
+#define LUBBOCK_USERSW 0x0060
+#define LUBBOCK_MISCWR 0x0080
+#define MISCWR_S1PWR (3U<<14)
+#define MISCWR_LCDDISP (1U<<8)
+#define MISCWR_IRDAMODE (1U<<4) /* 1=FIR, 0=SIR */
+#define MISCWR_GREENLED (1U<<3)
+#define MISCWR_ENETEN16 (1U<<2)
+#define MISCWR_PCRESET (1U<<1) /* Processor card reset */
+#define MSICWR_SYSRESET (1U<<0)
+#define LUBBOCK_MISCRD 0x0090
+#define LUBBOCK_INTRMASK 0x00c0
+#define LUBBOCK_INTRCTL 0x00d0
+
+#define ioreg_read(a) (*(volatile unsigned *)(a))
+#define ioreg_write(a,v) (*(volatile unsigned *)(a)=(v))
+
+#define ioreg16_read(a) (*(volatile uint16_t *)(a))
+#define ioreg16_write(a,v) (*(volatile uint16_t *)(a)=(v))
+
+#define ioreg8_read(a) (*(volatile uint8_t *)(a))
+#define ioreg8_write(a,v) (*(volatile uint8_t *)(a)=(v))
+
+#endif /* _EVBARM_LUBBOCK_REG_H */
diff --git a/sys/arch/zaurus/include/zaurus_var.h b/sys/arch/zaurus/include/zaurus_var.h
new file mode 100644
index 00000000000..4455328bf36
--- /dev/null
+++ b/sys/arch/zaurus/include/zaurus_var.h
@@ -0,0 +1,100 @@
+/* $NetBSD: lubbock_var.h,v 1.1 2003/06/18 10:51:15 bsh Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _EVBARM_LUBBOCK_VAR_H
+#define _EVBARM_LUBBOCK_VAR_H
+
+#include <sys/conf.h>
+#include <sys/device.h>
+
+#include <machine/bus.h>
+#include <machine/zaurus_reg.h>
+
+
+/*
+ * Lubbock on-board IO bus
+ */
+#define N_OBIO_IRQ 8
+
+struct obio_softc {
+ struct device sc_dev;
+ bus_space_tag_t sc_iot;
+ bus_space_handle_t sc_obioreg_ioh;
+ void *sc_ih; /* interrupt handler for obio on pxaip */
+ void *sc_si; /* software interrupt handler */
+ int sc_intr;
+ int sc_obio_intr_mask;
+ int sc_obio_intr_pending;
+ int sc_ipl; /* Max ipl among sub interrupts */
+ struct obio_handler {
+ int (* func)(void *);
+ void *arg;
+ int level;
+ } sc_handler[N_OBIO_IRQ];
+};
+
+typedef void *obio_chipset_tag_t;
+
+struct obio_attach_args {
+ obio_chipset_tag_t oba_sc;
+ bus_space_tag_t oba_iot; /* Bus tag */
+ bus_addr_t oba_addr; /* i/o address */
+ int oba_intr;
+};
+
+/* on-board hex LED */
+void hex_led_blank( uint32_t value, int blank );
+#define hex_led(value) ioreg_write( LUBBOCK_OBIO_VBASE+LUBBOCK_HEXLED, (value) )
+#define hex_led_p(value) ioreg_write( LUBBOCK_OBIO_PBASE+LUBBOCK_HEXLED, (value) )
+
+#define d_led(value) ioreg16_write( LUBBOCK_OBIO_VBASE+LUBBOCK_LEDCTL, (value) )
+
+/*
+ * IRQ handler
+ */
+void *obio_intr_establish(struct obio_softc *, int, int, int (*)(void *), void *);
+void obio_intr_disestablish(void *);
+
+#define obio_read(offset) ioreg_read(LUBBOCK_OBIO_VBASE+(offset))
+#define obio_write(offset,value) \
+ ioreg_write(LUBBOCK_OBIO_VBASE+(offset), (value))
+
+
+#define obio16_read(offset) ioreg16_read(LUBBOCK_OBIO_VBASE+(offset))
+#define obio16_write(offset,value) \
+ ioreg16_write(LUBBOCK_OBIO_VBASE+(offset), (value))
+
+#define obio8_read(offset) ioreg8_read(LUBBOCK_OBIO_VBASE+(offset))
+#define obio8_write(offset,value) \
+ ioreg8_write(LUBBOCK_OBIO_VBASE+(offset), (value))
+
+
+#endif /* _EVBARM_LUBBOCK_VAR_H */
diff --git a/sys/arch/zaurus/zaurus/autoconf.c b/sys/arch/zaurus/zaurus/autoconf.c
new file mode 100644
index 00000000000..1bd283fbd26
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/autoconf.c
@@ -0,0 +1,505 @@
+/* $OpenBSD: autoconf.c,v 1.1 2004/12/31 00:04:35 drahn Exp $ */
+/* $NetBSD: autoconf.c,v 1.2 2001/09/05 16:17:36 matt Exp $ */
+
+/*
+ * Copyright (c) 1994-1998 Mark Brinicombe.
+ * Copyright (c) 1994 Brini.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Mark Brinicombe for
+ * the NetBSD project.
+ * 4. The name of the company nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * RiscBSD kernel project
+ *
+ * autoconf.c
+ *
+ * Autoconfiguration functions
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/reboot.h>
+#include <sys/disklabel.h>
+#include <sys/device.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <machine/bootconfig.h>
+#include <machine/intr.h>
+
+#include <dev/cons.h>
+
+
+struct device *booted_device;
+int booted_partition;
+
+struct device *bootdv = NULL;
+
+int findblkmajor(struct device *dv);
+char * findblkname(int maj);
+
+void swapconf(void);
+void rootconf(void);
+void diskconf(void);
+
+static struct device * getdisk(char *str, int len, int defpart, dev_t *devp);
+struct device *parsedisk(char *, int, int, dev_t *);
+extern char *boot_file;
+
+#include "wd.h"
+#if NWD > 0
+extern struct cfdriver wd_cd;
+#endif
+#include "sd.h"
+#if NSD > 0
+extern struct cfdriver sd_cd;
+#endif
+#include "cd.h"
+#if NCD > 0
+extern struct cfdriver cd_cd;
+#endif
+#if NRD > 0
+extern struct cfdriver rd_cd;
+#endif
+#include "raid.h"
+#if NRAID > 0
+extern struct cfdriver raid_cd;
+#endif
+
+struct genericconf {
+ struct cfdriver *gc_driver;
+ char *gc_name;
+ dev_t gc_major;
+} genericconf[] = {
+#if NWD > 0
+ { &wd_cd, "wd", 16 },
+#endif
+#if NSD > 0
+ { &sd_cd, "sd", 24 },
+#endif
+#if NCD > 0
+ { &cd_cd, "cd", 26 },
+#endif
+#if NRD > 0
+ { &rd_cd, "rd", 18 },
+#endif
+#if NRAID > 0
+ { &raid_cd, "raid", 71 },
+#endif
+ { 0 }
+};
+
+int
+findblkmajor(dv)
+ struct device *dv;
+{
+ char *name = dv->dv_xname;
+ int i;
+
+ for (i = 0; i < sizeof(genericconf)/sizeof(genericconf[0]); ++i)
+ if (strncmp(name, genericconf[i].gc_name,
+ strlen(genericconf[i].gc_name)) == 0)
+ return (genericconf[i].gc_major);
+ return (-1);
+}
+
+char *
+findblkname(maj)
+ int maj;
+{
+ int i;
+
+ for (i = 0; i < sizeof(genericconf)/sizeof(genericconf[0]); ++i)
+ if (maj == genericconf[i].gc_major)
+ return (genericconf[i].gc_name);
+ return (NULL);
+}
+
+static struct device *
+getdisk(char *str, int len, int defpart, dev_t *devp)
+{
+ struct device *dv;
+
+ if ((dv = parsedisk(str, len, defpart, devp)) == NULL) {
+ printf("use one of:");
+ for (dv = alldevs.tqh_first; dv != NULL;
+ dv = dv->dv_list.tqe_next) {
+ if (dv->dv_class == DV_DISK)
+ printf(" %s[a-p]", dv->dv_xname);
+#ifdef NFSCLIENT
+ if (dv->dv_class == DV_IFNET)
+ printf(" %s", dv->dv_xname);
+#endif
+ }
+ printf("\n");
+ }
+ return (dv);
+}
+
+struct device *
+parsedisk(char *str, int len, int defpart, dev_t *devp)
+{
+ struct device *dv;
+ char *cp, c;
+ int majdev, part;
+
+ if (len == 0)
+ return (NULL);
+ cp = str + len - 1;
+ c = *cp;
+ if (c >= 'a' && (c - 'a') < MAXPARTITIONS) {
+ part = c - 'a';
+ *cp = '\0';
+ } else
+ part = defpart;
+
+ for (dv = alldevs.tqh_first; dv != NULL; dv = dv->dv_list.tqe_next) {
+ if (dv->dv_class == DV_DISK &&
+ strcmp(str, dv->dv_xname) == 0) {
+ majdev = findblkmajor(dv);
+ if (majdev < 0)
+ panic("parsedisk");
+ *devp = MAKEDISKDEV(majdev, dv->dv_unit, part);
+ break;
+ }
+#ifdef NFSCLIENT
+ if (dv->dv_class == DV_IFNET &&
+ strcmp(str, dv->dv_xname) == 0) {
+ *devp = NODEV;
+ break;
+ }
+#endif
+ }
+
+ *cp = c;
+ return (dv);
+}
+
+
+/*
+ * Now that we are fully operational, we can checksum the
+ * disks, and using some heuristics, hopefully are able to
+ * always determine the correct root disk.
+ */
+void
+diskconf()
+{
+ /*
+ * Configure root, swap, and dump area. This is
+ * currently done by running the same checksum
+ * algorithm over all known disks, as was done in
+ * /boot. Then we basically fixup the *dev vars
+ * from the info we gleaned from this.
+ */
+#if 0
+ dkcsumattach();
+
+#endif
+ rootconf();
+#if 0
+ swapconf();
+ dumpconf();
+#endif
+}
+
+/*
+ * Configure swap space and related parameters.
+ */
+void
+swapconf()
+{
+ register struct swdevt *swp;
+ register int nblks;
+
+ for (swp = swdevt; swp->sw_dev != NODEV; swp++) {
+ int maj = major(swp->sw_dev);
+
+ if (maj > nblkdev)
+ break;
+ if (bdevsw[maj].d_psize) {
+ nblks = (*bdevsw[maj].d_psize)(swp->sw_dev);
+ if (nblks != -1 &&
+ (swp->sw_nblks == 0 || swp->sw_nblks > nblks))
+ swp->sw_nblks = nblks;
+ swp->sw_nblks = ctod(dtoc(swp->sw_nblks));
+ }
+ }
+}
+
+void rootconf(void);
+void diskconf(void);
+
+
+/*
+ * void cpu_configure()
+ *
+ * Configure all the root devices
+ * The root devices are expected to configure their own children
+ */
+void
+cpu_configure(void)
+{
+ softintr_init();
+
+ /*
+ * Since various PCI interrupts could be routed via the ICU
+ * (for PCI devices in the bridge) we need to set up the ICU
+ * now so that these interrupts can be established correctly
+ * i.e. This is a hack.
+ */
+
+ config_rootfound("mainbus", NULL);
+
+ /*
+ * We can not know which is our root disk, defer
+ * until we can checksum blocks to figure it out.
+ */
+ md_diskconf = diskconf;
+ cold = 0;
+
+ /* Time to start taking interrupts so lets open the flood gates .... */
+ (void)spl0();
+
+}
+
+/*
+ * Attempt to find the device from which we were booted.
+ * If we can do so, and not instructed not to do so,
+ * change rootdev to correspond to the load device.
+ */
+void
+rootconf()
+{
+ int majdev, mindev, unit, part, len;
+ dev_t temp;
+ struct swdevt *swp;
+ struct device *dv;
+ dev_t nrootdev, nswapdev = NODEV;
+ char buf[128];
+ int s;
+
+#if defined(NFSCLIENT)
+ extern char *nfsbootdevname;
+#endif
+
+ printf("boot_file: '%s'\n", boot_file);
+
+ if(boothowto & RB_DFLTROOT)
+ return; /* Boot compiled in */
+
+ /*
+ * (raid) device auto-configuration could have returned
+ * the root device's id in rootdev. Check this case.
+ */
+ if (rootdev != NODEV) {
+ majdev = major(rootdev);
+ unit = DISKUNIT(rootdev);
+ part = DISKPART(rootdev);
+
+ len = snprintf(buf, sizeof buf, "%s%d", findblkname(majdev),
+ unit);
+ if (len >= sizeof(buf))
+ panic("rootconf: device name too long");
+
+ bootdv = getdisk(buf, len, part, &rootdev);
+ }
+
+ /* Lookup boot device from boot if not set by configuration */
+ if(bootdv == NULL) {
+ bootdv = parsedisk(boot_file, strlen(boot_file), 0, &temp);
+ }
+ if(bootdv == NULL) {
+ printf("boot device: lookup '%s' failed.\n", boot_file);
+ boothowto |= RB_ASKNAME; /* Don't Panic :-) */
+ /* boothowto |= RB_SINGLE; */
+ } else
+ printf("boot device: %s.\n", bootdv->dv_xname);
+
+ if (boothowto & RB_ASKNAME) {
+ for (;;) {
+ printf("root device ");
+ if (bootdv != NULL)
+ printf("(default %s%c)",
+ bootdv->dv_xname,
+ bootdv->dv_class == DV_DISK
+ ? 'a' : ' ');
+ printf(": ");
+ s = splimp();
+ cnpollc(1);
+ len = getsn(buf, sizeof(buf));
+
+ cnpollc(0);
+ splx(s);
+ if (len == 0 && bootdv != NULL) {
+ strlcpy(buf, bootdv->dv_xname, sizeof buf);
+ len = strlen(buf);
+ }
+ if (len > 0 && buf[len - 1] == '*') {
+ buf[--len] = '\0';
+ dv = getdisk(buf, len, 1, &nrootdev);
+ if (dv != NULL) {
+ bootdv = dv;
+ nswapdev = nrootdev;
+ goto gotswap;
+ }
+ }
+ dv = getdisk(buf, len, 0, &nrootdev);
+ if (dv != NULL) {
+ bootdv = dv;
+ break;
+ }
+ }
+ /*
+ * because swap must be on same device as root, for
+ * network devices this is easy.
+ */
+ if (bootdv->dv_class == DV_IFNET)
+ goto gotswap;
+
+ for (;;) {
+ printf("swap device ");
+ if (bootdv != NULL)
+ printf("(default %s%c)",
+ bootdv->dv_xname,
+ bootdv->dv_class == DV_DISK?'b':' ');
+ printf(": ");
+ s = splimp();
+ cnpollc(1);
+ len = getsn(buf, sizeof(buf));
+ cnpollc(0);
+ splx(s);
+ if (len == 0 && bootdv != NULL) {
+ switch (bootdv->dv_class) {
+ case DV_IFNET:
+ nswapdev = NODEV;
+ break;
+ case DV_DISK:
+ nswapdev = MAKEDISKDEV(major(nrootdev),
+ DISKUNIT(nrootdev), 1);
+ break;
+ case DV_TAPE:
+ case DV_TTY:
+ case DV_DULL:
+ case DV_CPU:
+ break;
+ }
+ break;
+ }
+ dv = getdisk(buf, len, 1, &nswapdev);
+ if (dv) {
+ if (dv->dv_class == DV_IFNET)
+ nswapdev = NODEV;
+ break;
+ }
+ }
+
+gotswap:
+ rootdev = nrootdev;
+ dumpdev = nswapdev;
+ swdevt[0].sw_dev = nswapdev;
+ swdevt[1].sw_dev = NODEV;
+ }
+ else if(mountroot == NULL) {
+ /*
+ * `swap generic': Use the device the ROM told us to use.
+ */
+ if (bootdv == NULL)
+ panic("boot device not known");
+
+ majdev = findblkmajor(bootdv);
+
+ if (majdev >= 0) {
+ /*
+ * Root and Swap are on disk.
+ * Boot is always from partition 0.
+ */
+ rootdev = MAKEDISKDEV(majdev, bootdv->dv_unit, 0);
+ nswapdev = MAKEDISKDEV(majdev, bootdv->dv_unit, 1);
+ dumpdev = nswapdev;
+ } else {
+ /*
+ * Root and Swap are on net.
+ */
+ nswapdev = dumpdev = NODEV;
+ }
+ swdevt[0].sw_dev = nswapdev;
+ swdevt[1].sw_dev = NODEV;
+
+ } else {
+
+ /*
+ * `root DEV swap DEV': honour rootdev/swdevt.
+ * rootdev/swdevt/mountroot already properly set.
+ */
+ return;
+ }
+
+ switch (bootdv->dv_class) {
+#if defined(NFSCLIENT)
+ case DV_IFNET:
+ mountroot = nfs_mountroot;
+ nfsbootdevname = bootdv->dv_xname;
+ return;
+#endif
+ case DV_DISK:
+ mountroot = dk_mountroot;
+ majdev = major(rootdev);
+ mindev = minor(rootdev);
+ unit = DISKUNIT(rootdev);
+ part = DISKPART(rootdev);
+ printf("root on %s%c\n", bootdv->dv_xname, part + 'a');
+ break;
+ default:
+ printf("can't figure root, hope your kernel is right\n");
+ return;
+ }
+
+ /*
+ * XXX: What is this doing?
+ */
+ temp = NODEV;
+ for (swp = swdevt; swp->sw_dev != NODEV; swp++) {
+ if (majdev == major(swp->sw_dev) &&
+ unit == DISKUNIT(swp->sw_dev)) {
+ temp = swdevt[0].sw_dev;
+ swdevt[0].sw_dev = swp->sw_dev;
+ swp->sw_dev = temp;
+ break;
+ }
+ }
+ if (swp->sw_dev == NODEV)
+ return;
+
+ /*
+ * If dumpdev was the same as the old primary swap device, move
+ * it to the new primary swap device.
+ */
+ if (temp == dumpdev)
+ dumpdev = swdevt[0].sw_dev;
+}
+/* End of autoconf.c */
diff --git a/sys/arch/zaurus/zaurus/obio.c b/sys/arch/zaurus/zaurus/obio.c
new file mode 100644
index 00000000000..96f98b5c794
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/obio.c
@@ -0,0 +1,341 @@
+/* $NetBSD: obio.c,v 1.2 2003/07/15 00:25:06 lukem Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * TODO: dispatch interrupt to SOFTSERIAL or SOFTNET according to requested
+ * interrupt level.
+ */
+
+#include <sys/cdefs.h>
+/*
+__KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.2 2003/07/15 00:25:06 lukem Exp $");
+*/
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/kernel.h>
+#include <sys/reboot.h>
+
+#include <machine/cpu.h>
+#include <machine/bus.h>
+#include <machine/intr.h>
+#include <arm/cpufunc.h>
+
+#include <arm/mainbus/mainbus.h>
+#include <arm/xscale/pxa2x0reg.h>
+#include <arm/xscale/pxa2x0var.h>
+#include <arm/xscale/pxa2x0_gpio.h>
+#include <arm/sa11x0/sa11x0_var.h>
+#include <machine/zaurus_reg.h>
+#include <machine/zaurus_var.h>
+
+/* prototypes */
+static int obio_match(struct device *, void *, void *);
+static void obio_attach(struct device *, struct device *, void *);
+static int obio_search(struct device *, struct cfdata *, void *);
+static int obio_print(void *, const char *);
+
+/* attach structures */
+struct cfattach obio_ca = {
+ sizeof (struct obio_softc), obio_match, obio_attach
+};
+
+struct cfdriver obio_cd = {
+ NULL, "obio", DV_DULL
+};
+
+
+uint32_t obio_intr_mask;
+
+static int
+obio_spurious(void *arg)
+{
+ int irqno = (int)arg;
+
+ printf("Spurious interrupt %d on On-board peripheral", irqno);
+ return 1;
+}
+
+
+/*
+ * interrupt handler for GPIO0 (on-board peripherals)
+ *
+ * On Lubbock, 8 interrupts are ORed through on-board logic,
+ * and routed to GPIO0 of PXA250 processor.
+ */
+static int
+obio_intr(void *arg)
+{
+ int irqno, pending, mask;
+ struct obio_softc *sc = (struct obio_softc *)arg;
+ int psw;
+
+ mask = sc->sc_obio_intr_mask; /* real irq mask for obio */
+
+ psw = disable_interrupts(I32_bit|F32_bit);
+ pending = bus_space_read_2(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRCTL);
+ /* Here is a chance to lose some interrupts.
+ * You need to modify FPGA program to avoid it
+ */
+ bus_space_write_2(sc->sc_iot, sc->sc_obioreg_ioh, LUBBOCK_INTRCTL, 0);
+ restore_interrupts(psw);
+
+
+ pending &= mask;
+ while (pending) {
+ irqno = 0;
+
+ for ( ;pending; ++irqno) {
+ if (0 == (pending & (1U<<irqno)))
+ continue;
+ pending &= ~(1U<<irqno);
+
+#ifdef notyet
+ /* if ipl of this irq is higher than current spl level,
+ call the handler directly instead of dispatching it to
+ software interrupt. */
+ if (sc->sc_handler[irqno].level > current_spl_level) {
+ (* sc->sc_handler[irqno].func)(
+ sc->sc_handler[irqno].arg );
+ }
+ else
+#endif
+ {
+ /* mask this interrupt until software
+ interrupt is handled. */
+ sc->sc_obio_intr_pending |= (1U<<irqno);
+ mask &= ~(1U<<irqno);
+ bus_space_write_4(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRMASK, mask);
+
+ /* handle it later */
+ softintr_schedule(sc->sc_si);
+ }
+ }
+
+ psw = disable_interrupts(I32_bit|F32_bit);
+ pending = bus_space_read_2(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRCTL);
+ bus_space_write_2(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRCTL,0);
+ restore_interrupts(psw);
+ pending &= mask;
+ }
+
+ /* GPIO interrupt is edge triggered. make a pulse
+ to let Cotulla notice when other interrupts are
+ still pending */
+ bus_space_write_2(sc->sc_iot, sc->sc_obioreg_ioh, LUBBOCK_INTRMASK, 0);
+ bus_space_write_2(sc->sc_iot, sc->sc_obioreg_ioh, LUBBOCK_INTRMASK, mask);
+ return 1;
+}
+
+static void
+obio_softintr(void *arg)
+{
+ struct obio_softc *sc = (struct obio_softc *)arg;
+ int irqno;
+ int psw;
+ int spl_save = current_spl_level;
+
+ psw = disable_interrupts(I32_bit);
+ while ((irqno = find_first_bit(sc->sc_obio_intr_pending)) >= 0) {
+ sc->sc_obio_intr_pending &= ~(1U<<irqno);
+
+ restore_interrupts(psw);
+
+ _splraise(sc->sc_handler[irqno].level);
+ (* sc->sc_handler[irqno].func)(
+ sc->sc_handler[irqno].arg);
+ splx(spl_save);
+
+ psw = disable_interrupts(I32_bit);
+ }
+
+ bus_space_write_4(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRMASK, sc->sc_obio_intr_mask);
+
+ restore_interrupts(psw);
+}
+
+/*
+ * int obio_print(void *aux, const char *name)
+ * print configuration info for children
+ */
+
+static int
+obio_print(void *aux, const char *name)
+{
+ struct obio_attach_args *oba = (struct obio_attach_args*)aux;
+
+ if (oba->oba_addr != -1)
+ printf(" addr 0x%lx", oba->oba_addr);
+ if (oba->oba_intr > 0)
+ printf(" intr %d", oba->oba_intr);
+ return (UNCONF);
+}
+
+int
+obio_match(struct device *parent, void *match, void *aux)
+{
+ return 1;
+}
+
+void
+obio_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct obio_softc *sc = (struct obio_softc*)self;
+ int system_id, baseboard_id, expansion_id, processor_card_id;
+ struct pxaip_attach_args *sa = (struct pxaip_attach_args *)aux;
+ char *processor_card_name;
+ int i;
+
+
+ /* Map on-board FPGA registers */
+ sc->sc_iot = &pxa2x0_bs_tag;
+ if (bus_space_map(sc->sc_iot, LUBBOCK_OBIO_PBASE, LUBBOCK_OBIO_SIZE,
+ 0, &(sc->sc_obioreg_ioh))) {
+ printf("%s: can't map FPGA registers\n", self->dv_xname);
+ }
+
+ system_id = bus_space_read_4(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_SYSTEMID);
+
+ baseboard_id = (system_id>>8) & 0x0f;
+ expansion_id = (system_id>>4) & 0x0f;
+ processor_card_id = system_id & 0x0f;
+
+ switch (processor_card_id) {
+ case 0: processor_card_name = "Cotulla"; break;
+ case 1: processor_card_name = "Sabinal"; break;
+ default: processor_card_name = "(unknown)";
+ }
+
+ printf(" : baseboard=%d (%s), expansion card=%d, processor card=%d (%s)\n",
+ baseboard_id,
+ baseboard_id==8 ? "DBPXA250(lubbock)" : "(unknown)",
+ expansion_id,
+ processor_card_id, processor_card_name );
+
+ /*
+ * Mask all interrupts.
+ * They are later unmasked at each device's attach routine.
+ */
+ bus_space_write_4(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRMASK,0);
+
+ sc->sc_intr = sa->pxa_intr; /* irq no. on ICU. */
+ sc->sc_obio_intr_mask = 0; /* No interrupt used */
+ sc->sc_obio_intr_pending = 0;
+ sc->sc_ipl = IPL_BIO;
+
+ for (i=0; i < N_OBIO_IRQ; ++i) {
+ sc->sc_handler[i].func = obio_spurious;
+ sc->sc_handler[i].arg = (void *)i;
+ }
+
+
+ /*
+ * establish interrupt handler.
+ */
+#if 0
+ /*
+ * level is lowest at first, and changed when
+ * sub-interrupt handlers are established
+ */
+ sc->sc_ipl = IPL_BIO;
+#else
+ /*
+ * level is very high to allow high priority sub-interrupts.
+ */
+ sc->sc_ipl = IPL_AUDIO;
+#endif
+ sc->sc_ih = pxa2x0_gpio_intr_establish(0, IST_EDGE_FALLING, sc->sc_ipl,
+ obio_intr, sc, sc->sc_dev.dv_xname);
+ sc->sc_si = softintr_establish(IPL_SOFTNET, obio_softintr, sc);
+
+
+ /*
+ * Attach each devices
+ */
+ obio_search(self, NULL, NULL);
+}
+
+int
+obio_search(parent, cf, aux)
+ struct device *parent;
+ struct cfdata *cf;
+ void *aux;
+{
+ struct obio_softc *sc = (struct obio_softc *)parent;
+ struct obio_attach_args oba;
+
+ oba.oba_sc = sc;
+ oba.oba_iot = sc->sc_iot;
+ oba.oba_addr = -1;
+ oba.oba_intr = -1;
+
+ config_found(parent, &oba, obio_print);
+
+ return 0;
+}
+
+void *
+obio_intr_establish(struct obio_softc *sc,
+ int irq, int ipl, int (*func)(void *), void *arg)
+{
+ int psw;
+
+ if (irq < 0 || N_OBIO_IRQ <= irq)
+ panic("Bad irq no for obio");
+
+ psw = disable_interrupts(I32_bit);
+
+ sc->sc_handler[irq].func = func;
+ sc->sc_handler[irq].arg = arg;
+ sc->sc_handler[irq].level = ipl;
+
+#ifdef notyet
+ if (ipl > sc->sc_ipl) {
+ pxa2x0_update_intr_masks(sc->sc_intr, ipl);
+ sc->sc_ipl = ipl;
+ }
+#endif
+
+ sc->sc_obio_intr_mask |= (1U << irq);
+ bus_space_write_4(sc->sc_iot, sc->sc_obioreg_ioh,
+ LUBBOCK_INTRMASK, sc->sc_obio_intr_mask);
+
+ enable_interrupts(psw);
+ return &sc->sc_handler[irq];
+}
diff --git a/sys/arch/zaurus/zaurus/zaurus_lcd.c b/sys/arch/zaurus/zaurus/zaurus_lcd.c
new file mode 100644
index 00000000000..4caa2634129
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/zaurus_lcd.c
@@ -0,0 +1,328 @@
+/* $NetBSD: lubbock_lcd.c,v 1.1 2003/08/09 19:38:53 bsh Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * LCD driver for Intel Lubbock.
+ *
+ * Controlling LCD is almost completely done through PXA2X0's
+ * integrated LCD controller. Codes for it is arm/xscale/pxa2x0_lcd.c.
+ *
+ * Codes in this file provide platform specific things including:
+ * LCD on/off switch in on-board PLD register.
+ * LCD panel geometry
+ */
+#include <sys/cdefs.h>
+/*
+__KERNEL_RCSID(0, "$NetBSD: lubbock_lcd.c,v 1.1 2003/08/09 19:38:53 bsh Exp $");
+*/
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/uio.h>
+#include <sys/malloc.h>
+
+#include <dev/cons.h>
+#include <dev/wscons/wsconsio.h>
+#include <dev/wscons/wsdisplayvar.h>
+#include <dev/wscons/wscons_callbacks.h>
+
+#include <machine/bus.h>
+#include <arm/xscale/pxa2x0var.h>
+#include <arm/xscale/pxa2x0reg.h>
+#include <arm/xscale/pxa2x0_lcd.h>
+
+#include <machine/zaurus_reg.h>
+#include <machine/zaurus_var.h>
+
+#include "wsdisplay.h"
+
+int lcd_match( struct device *, void *, void *);
+void lcd_attach( struct device *, struct device *, void *);
+int lcdintr(void *);
+
+#if NWSDISPLAY > 0
+
+/*
+ * wsdisplay glue
+ */
+struct pxa2x0_wsscreen_descr lcd_bpp16_screen = {
+ {
+ "bpp16", 0, 0,
+ &pxa2x0_lcd_emulops,
+ 0, 0,
+ WSSCREEN_WSCOLORS,
+ },
+ 16 /* bits per pixel */
+}, lcd_bpp8_screen = {
+ {
+ "bpp8", 0, 0,
+ &pxa2x0_lcd_emulops,
+ 0, 0,
+ WSSCREEN_WSCOLORS,
+ },
+ 8 /* bits per pixel */
+}, lcd_bpp4_screen = {
+ {
+ "bpp4", 0, 0,
+ &pxa2x0_lcd_emulops,
+ 0, 0,
+ WSSCREEN_WSCOLORS,
+ },
+ 4 /* bits per pixel */
+};
+
+
+static const struct wsscreen_descr *lcd_scr_descr[] = {
+#if 0
+ /* bpp4 needs a patch to rasops4 */
+ &lcd_bpp4_screen.c,
+ &lcd_bpp8_screen.c,
+#endif
+ &lcd_bpp16_screen.c,
+};
+
+const struct wsscreen_list lcd_screen_list = {
+ sizeof lcd_scr_descr / sizeof lcd_scr_descr[0],
+ lcd_scr_descr
+};
+
+int lcd_ioctl(void *, u_long, caddr_t, int, struct proc *);
+
+int lcd_show_screen(void *, void *, int,
+ void (*)(void *, int, int), void *);
+
+const struct wsdisplay_accessops lcd_accessops = {
+ lcd_ioctl,
+ pxa2x0_lcd_mmap,
+ pxa2x0_lcd_alloc_screen,
+ pxa2x0_lcd_free_screen,
+ lcd_show_screen,
+ NULL, /* load_font */
+};
+
+#else
+/*
+ * Interface to LCD framebuffer without wscons
+ */
+dev_type_open(lcdopen);
+dev_type_close(lcdclose);
+dev_type_ioctl(lcdioctl);
+dev_type_mmap(lcdmmap);
+const struct cdevsw lcd_cdevsw = {
+ lcdopen, lcdclose, noread, nowrite,
+ lcdioctl, nostop, notty, nopoll, lcdmmap, D_TTY
+};
+
+#endif
+
+#if 0
+CFATTACH_DECL(lcd_obio, sizeof (struct pxa2x0_lcd_softc), lcd_match,
+ lcd_attach, NULL, NULL);
+#endif
+struct cfattach lcd_obio_ca = {
+ sizeof (struct pxa2x0_lcd_softc), lcd_match, lcd_attach
+};
+
+struct cfdriver lcd_cd = {
+ NULL, "lcd_obio", DV_DULL
+};
+
+int
+lcd_match( struct device *parent, void *cf, void *aux )
+{
+ return 1;
+}
+
+/*
+#define CURRENT_DISPLAY opus
+*/
+#define CURRENT_DISPLAY sharp_LM8V31
+
+static const struct lcd_panel_geometry sharp_LM8V31 =
+{
+ 640, /* Width */
+ 480, /* Height */
+ 0, /* No extra lines */
+
+ LCDPANEL_PASSIVE|LCDPANEL_PCP,
+ 10, /* clock divider */
+ 0xff, /* AC bias pin freq */
+
+ 2, /* horizontal sync pulse width */
+ 3, /* BLW */
+ 3, /* ELW */
+
+ 1, /* vertical sync pulse width */
+ 0, /* BFW */
+ 0, /* EFW */
+
+};
+
+static const struct lcd_panel_geometry opus =
+{
+ 240, /* Width */
+ 320, /* Height */
+ 0, /* No extra lines */
+
+ LCDPANEL_PASSIVE|LCDPANEL_PCP,
+ 10, /* clock divider */
+ 0xff, /* AC bias pin freq */
+
+ 2, /* horizontal sync pulse width */
+ 3, /* BLW */
+ 3, /* ELW */
+
+ 1, /* vertical sync pulse width */
+ 0, /* BFW */
+ 0, /* EFW */
+
+};
+
+void lcd_attach( struct device *parent, struct device *self, void *aux )
+{
+ struct pxa2x0_lcd_softc *sc = (struct pxa2x0_lcd_softc *)self;
+
+ pxa2x0_lcd_attach_sub(sc, aux, &CURRENT_DISPLAY);
+
+
+#if NWSDISPLAY > 0
+
+ {
+ struct wsemuldisplaydev_attach_args aa;
+
+ /* make wsdisplay screen list */
+ pxa2x0_lcd_setup_wsscreen( &lcd_bpp16_screen, &CURRENT_DISPLAY, NULL );
+ /*
+ pxa2x0_lcd_setup_wsscreen( &lcd_bpp8_screen, &CURRENT_DISPLAY, NULL );
+ pxa2x0_lcd_setup_wsscreen( &lcd_bpp4_screen, &CURRENT_DISPLAY, NULL );
+ */
+
+ aa.console = 0;
+ aa.scrdata = &lcd_screen_list;
+ aa.accessops = &lcd_accessops;
+ aa.accesscookie = sc;
+
+ printf( "\n" );
+
+ (void) config_found(self, &aa, wsemuldisplaydevprint);
+ }
+#else
+ {
+ struct pxa2x0_lcd_screen *screen = pxa2x0_lcd_new_screen( sc, 8 );
+
+ if( screen ){
+ sc->active = screen;
+ pxa2x0_lcd_start_dma( sc, screen );
+ }
+
+ printf( "\n" );
+ }
+#endif
+
+}
+
+#if NWSDISPLAY > 0
+
+int
+lcd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
+{
+ struct obio_softc *osc =
+ (struct obio_softc *)((struct device *)v)->dv_parent;
+ uint16_t reg;
+
+ switch (cmd) {
+ case WSDISPLAYIO_SVIDEO:
+ reg = bus_space_read_2( osc->sc_iot, osc->sc_obioreg_ioh,
+ LUBBOCK_MISCWR );
+ if( *(int *)data == WSDISPLAYIO_VIDEO_ON )
+ reg |= MISCWR_LCDDISP;
+ else
+ reg &= ~MISCWR_LCDDISP;
+ bus_space_write_2( osc->sc_iot, osc->sc_obioreg_ioh,
+ LUBBOCK_MISCWR, reg );
+ break; /* turn on/off LCD controller */
+ }
+
+ return pxa2x0_lcd_ioctl( v, cmd, data, flag, p );
+}
+
+int
+lcd_show_screen(void *v, void *cookie, int waitok,
+ void (*cb)(void *, int, int), void *cbarg)
+{
+ struct obio_softc *osc =
+ (struct obio_softc *)((struct device *)v)->dv_parent;
+
+ pxa2x0_lcd_show_screen(v,cookie,waitok,cb,cbarg);
+
+ /* Turn on LCD */
+ bus_space_write_4( osc->sc_iot, osc->sc_obioreg_ioh, LUBBOCK_MISCWR,
+ MISCWR_LCDDISP |
+ bus_space_read_4( osc->sc_iot, osc->sc_obioreg_ioh, LUBBOCK_MISCWR ) );
+
+ return (0);
+}
+
+
+
+#else /* NWSDISPLAY==0 */
+
+int
+lcdopen( dev_t dev, int oflags, int devtype, struct proc *p )
+{
+ return 0;
+}
+
+int
+lcdclose( dev_t dev, int fflag, int devtype, struct proc *p )
+{
+ return 0;
+}
+
+paddr_t
+lcdmmap( dev_t dev, off_t offset, int size )
+{
+ struct pxa2x0_lcd_softc *sc = device_lookup(&lcd_cd, minor(dev));
+ struct pxa2x0_lcd_screen *scr = sc->active;
+
+ return bus_dmamem_mmap( &pxa2x0_bus_dma_tag, scr->segs, scr->nsegs,
+ offset, 0, BUS_DMA_WAITOK|BUS_DMA_COHERENT );
+}
+
+int
+lcdioctl( dev_t dev, u_long cmd, caddr_t data,
+ int fflag, struct proc *p )
+{
+ return EOPNOTSUPP;
+}
+
+#endif /* NWSDISPLAY>0 */
diff --git a/sys/arch/zaurus/zaurus/zaurus_machdep.c b/sys/arch/zaurus/zaurus/zaurus_machdep.c
new file mode 100644
index 00000000000..90f030d6f23
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/zaurus_machdep.c
@@ -0,0 +1,1404 @@
+/* $NetBSD: lubbock_machdep.c,v 1.2 2003/07/15 00:25:06 lukem Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Machine dependant functions for kernel setup for
+ * Intel DBPXA250 evaluation board (a.k.a. Lubbock).
+ * Based on iq80310_machhdep.c
+ */
+/*
+ * Copyright (c) 2001 Wasabi Systems, Inc.
+ * All rights reserved.
+ *
+ * Written by Jason R. Thorpe for Wasabi Systems, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed for the NetBSD Project by
+ * Wasabi Systems, Inc.
+ * 4. The name of Wasabi Systems, Inc. may not be used to endorse
+ * or promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1997,1998 Mark Brinicombe.
+ * Copyright (c) 1997,1998 Causality Limited.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Mark Brinicombe
+ * for the NetBSD Project.
+ * 4. The name of the company nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Machine dependant functions for kernel setup for Intel IQ80310 evaluation
+ * boards using RedBoot firmware.
+ */
+
+/*
+ * DIP switches:
+ *
+ * S19: no-dot: set RB_KDB. enter kgdb session.
+ * S20: no-dot: set RB_SINGLE. don't go multi user mode.
+ */
+
+#include <sys/cdefs.h>
+#include "rd.h"
+#include "lcd.h"
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/exec.h>
+#include <sys/proc.h>
+#include <sys/msgbuf.h>
+#include <sys/reboot.h>
+#include <sys/termios.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <sys/conf.h>
+#include <sys/queue.h>
+#include <sys/device.h>
+#include <dev/cons.h>
+#include <dev/ic/smc91cxxreg.h>
+
+#include <machine/db_machdep.h>
+#include <ddb/db_sym.h>
+#include <ddb/db_extern.h>
+#ifdef KGDB
+#include <sys/kgdb.h>
+#endif
+
+#include <machine/bootconfig.h>
+#include <machine/bus.h>
+#include <machine/cpu.h>
+#include <machine/frame.h>
+#include <arm/undefined.h>
+#include <arm/machdep.h>
+
+#include <arm/xscale/pxa2x0reg.h>
+#include <arm/xscale/pxa2x0var.h>
+#include <arm/xscale/pxa2x0_gpio.h>
+#include <arm/sa11x0/sa1111_reg.h>
+#include <machine/zaurus_reg.h>
+#include <machine/zaurus_var.h>
+
+/* Kernel text starts 2MB in from the bottom of the kernel address space. */
+#define KERNEL_TEXT_BASE (KERNEL_BASE + 0x00200000)
+#define KERNEL_VM_BASE (KERNEL_BASE + 0x04000000)
+
+/*
+ * The range 0xc1000000 - 0xccffffff is available for kernel VM space
+ * Core-logic registers and I/O mappings occupy 0xfd000000 - 0xffffffff
+ */
+/*
+#define KERNEL_VM_SIZE 0x0C000000
+*/
+#define KERNEL_VM_SIZE 0x10000000
+
+
+/*
+ * Address to call from cpu_reset() to reset the machine.
+ * This is machine architecture dependant as it varies depending
+ * on where the ROM appears when you turn the MMU off.
+ */
+
+u_int cpu_reset_address = 0;
+
+/* Define various stack sizes in pages */
+#define IRQ_STACK_SIZE 1
+#define ABT_STACK_SIZE 1
+#ifdef IPKDB
+#define UND_STACK_SIZE 2
+#else
+#define UND_STACK_SIZE 1
+#endif
+
+BootConfig bootconfig; /* Boot config storage */
+char *boot_args = NULL;
+char *boot_file = NULL;
+
+vm_offset_t physical_start;
+vm_offset_t physical_freestart;
+vm_offset_t physical_freeend;
+vm_offset_t physical_end;
+u_int free_pages;
+vm_offset_t pagetables_start;
+int physmem = 0;
+
+/*int debug_flags;*/
+#ifndef PMAP_STATIC_L1S
+int max_processes = 64; /* Default number */
+#endif /* !PMAP_STATIC_L1S */
+
+/* Physical and virtual addresses for some global pages */
+pv_addr_t systempage;
+pv_addr_t irqstack;
+pv_addr_t undstack;
+pv_addr_t abtstack;
+extern pv_addr_t kernelstack;
+pv_addr_t minidataclean;
+
+vm_offset_t msgbufphys;
+
+extern u_int data_abort_handler_address;
+extern u_int prefetch_abort_handler_address;
+extern u_int undefined_handler_address;
+
+#ifdef PMAP_DEBUG
+extern int pmap_debug_level;
+#endif
+
+#define KERNEL_PT_SYS 0 /* Page table for mapping proc0 zero page */
+#define KERNEL_PT_KERNEL 1 /* Page table for mapping kernel */
+#define KERNEL_PT_KERNEL_NUM 32
+#define KERNEL_PT_VMDATA (KERNEL_PT_KERNEL+KERNEL_PT_KERNEL_NUM)
+ /* Page tables for mapping kernel VM */
+#define KERNEL_PT_VMDATA_NUM 8 /* start with 16MB of KVM */
+#define NUM_KERNEL_PTS (KERNEL_PT_VMDATA + KERNEL_PT_VMDATA_NUM)
+
+pv_addr_t kernel_pt_table[NUM_KERNEL_PTS];
+
+extern struct user *proc0paddr;
+
+/* Prototypes */
+
+#if 0
+void process_kernel_args(char *);
+void parse_mi_bootargs(char *args);
+#endif
+
+void consinit(void);
+void kgdb_port_init(void);
+void change_clock(uint32_t v);
+
+bs_protos(bs_notimpl);
+
+#include "com.h"
+#if NCOM > 0
+#include <dev/ic/comreg.h>
+#include <dev/ic/comvar.h>
+#endif
+
+#ifndef CONSPEED
+#define CONSPEED B9600 /* What RedBoot uses */
+#endif
+#ifndef CONMODE
+#define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
+#endif
+
+int comcnspeed = CONSPEED;
+int comcnmode = CONMODE;
+
+/*
+ * void boot(int howto, char *bootstr)
+ *
+ * Reboots the system
+ *
+ * Deal with any syncing, unmounting, dumping and shutdown hooks,
+ * then reset the CPU.
+ */
+void
+boot(int howto)
+{
+#ifdef DIAGNOSTIC
+ /* info */
+ printf("boot: howto=%08x curproc=%p\n", howto, curproc);
+#endif
+
+ /*
+ * If we are still cold then hit the air brakes
+ * and crash to earth fast
+ */
+ if (cold) {
+ doshutdownhooks();
+ if ((howto & (RB_HALT | RB_USERREQ)) != RB_USERREQ) {
+ printf("The operating system has halted.\n");
+ printf("Please press any key to reboot.\n\n");
+ cngetc();
+ }
+ printf("rebooting...\n");
+ cpu_reset();
+ /*NOTREACHED*/
+ }
+
+ /* Disable console buffering */
+/* cnpollc(1);*/
+
+ /*
+ * If RB_NOSYNC was not specified sync the discs.
+ * Note: Unless cold is set to 1 here, syslogd will die during the
+ * unmount. It looks like syslogd is getting woken up only to find
+ * that it cannot page part of the binary in as the filesystem has
+ * been unmounted.
+ */
+ if (!(howto & RB_NOSYNC))
+ bootsync();
+
+ /* Say NO to interrupts */
+ splhigh();
+
+ /* Do a dump if requested. */
+ if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP)
+ dumpsys();
+
+ /* Run any shutdown hooks */
+ doshutdownhooks();
+
+ /* Make sure IRQ's are disabled */
+ IRQdisable;
+
+ if (howto & RB_HALT) {
+ printf("The operating system has halted.\n");
+ printf("Please press any key to reboot.\n\n");
+ cngetc();
+ }
+
+ printf("rebooting...\n");
+ cpu_reset();
+ /*NOTREACHED*/
+}
+
+static __inline
+pd_entry_t *
+read_ttb(void)
+{
+ long ttb;
+
+ __asm __volatile("mrc p15, 0, %0, c2, c0, 0" : "=r" (ttb));
+
+
+ return (pd_entry_t *)(ttb & ~((1<<14)-1));
+}
+
+/*
+ * Mapping table for core kernel memory. These areas are mapped in
+ * init time at fixed virtual address with section mappings.
+ */
+struct l1_sec_map {
+ vaddr_t va;
+ vaddr_t pa;
+ vsize_t size;
+ int flags;
+} l1_sec_table[] = {
+ {
+ LUBBOCK_OBIO_VBASE,
+ LUBBOCK_OBIO_PBASE,
+ LUBBOCK_OBIO_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ LUBBOCK_GPIO_VBASE,
+ PXA2X0_GPIO_BASE,
+ PXA2X0_GPIO_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ LUBBOCK_CLKMAN_VBASE,
+ PXA2X0_CLKMAN_BASE,
+ PXA2X0_CLKMAN_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ LUBBOCK_INTCTL_VBASE,
+ PXA2X0_INTCTL_BASE,
+ PXA2X0_INTCTL_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ LUBBOCK_INTCTL_VBASE,
+ PXA2X0_INTCTL_BASE,
+ PXA2X0_INTCTL_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ LUBBOCK_AGPIO_VBASE,
+ 0x10800000,
+ 0x00010000, /* XXX */
+ PTE_NOCACHE,
+ },
+ {0, 0, 0, 0,}
+};
+
+static void
+map_io_area(paddr_t pagedir)
+{
+ int loop;
+
+ /*
+ * Map devices we can map w/ section mappings.
+ */
+ loop = 0;
+ while (l1_sec_table[loop].size) {
+ vm_size_t sz;
+
+#define VERBOSE_INIT_ARM
+#ifdef VERBOSE_INIT_ARM
+ printf("%08lx -> %08lx @ %08lx\n", l1_sec_table[loop].pa,
+ l1_sec_table[loop].pa + l1_sec_table[loop].size - 1,
+ l1_sec_table[loop].va);
+#endif
+ for (sz = 0; sz < l1_sec_table[loop].size; sz += L1_S_SIZE)
+ pmap_map_section(pagedir, l1_sec_table[loop].va + sz,
+ l1_sec_table[loop].pa + sz,
+ VM_PROT_READ|VM_PROT_WRITE,
+ l1_sec_table[loop].flags);
+ ++loop;
+ }
+}
+
+/*
+ * simple memory mapping function used in early bootstrap stage
+ * before pmap is initialized.
+ * size and cacheability are ignored and map one section with nocache.
+ */
+static vaddr_t section_free = LUBBOCK_VBASE_FREE;
+
+static int
+bootstrap_bs_map(void *t, bus_addr_t bpa, bus_size_t size,
+ int cacheable, bus_space_handle_t *bshp)
+{
+ u_long startpa;
+ vaddr_t va;
+ pd_entry_t *pagedir = read_ttb();
+ /* This assumes PA==VA for page directory */
+
+ va = section_free;
+ section_free += L1_S_SIZE;
+
+ startpa = trunc_page(bpa);
+ pmap_map_section((vaddr_t)pagedir, va, startpa,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
+ cpu_tlb_flushD();
+
+ *bshp = (bus_space_handle_t)(va + (bpa - startpa));
+
+ return(0);
+}
+
+static void
+copy_io_area_map(pd_entry_t *new_pd)
+{
+ pd_entry_t *cur_pd = read_ttb();
+ vaddr_t va;
+
+ for (va = LUBBOCK_IO_AREA_VBASE;
+ (cur_pd[va>>L1_S_SHIFT] & L1_TYPE_MASK) == L1_TYPE_S;
+ va += L1_S_SIZE) {
+
+ new_pd[va>>L1_S_SHIFT] = cur_pd[va>>L1_S_SHIFT];
+ if (va == (0 - L1_S_SIZE))
+ break; /* STUPID */
+
+ }
+}
+
+void green_on(int virt);
+void
+green_on(int virt)
+{
+ /* clobber green led p */
+ volatile u_int16_t *p;
+ if (virt)
+ p = (u_int16_t *)(LUBBOCK_AGPIO_VBASE+24);
+ else
+ p = (u_int16_t *)0x10800024;
+
+ *p = *p | 2;
+}
+
+void sysprobe(void);
+void
+sysprobe(void)
+{
+ u_int32_t *p;
+
+ p = (void *)0x48000014; /* MECR */
+ printf("MECR %x\n", *p);
+
+ p = (void *)0x48000028; /* MCMEM0 */
+ printf("MCMEM0 %x\n", *p);
+ p = (void *)0x4800002C; /* MCMEM1 */
+ printf("MCMEM1 %x\n", *p);
+
+ p = (void *)0x48000030; /* MCATTx */
+ printf("MCATT0 %x\n", *p);
+ p = (void *)0x48000034; /* MCATTx */
+ printf("MCATT1 %x\n", *p);
+
+ p = (void *)0x48000038; /* MCIOx */
+ printf("MCIO0 %x\n", *p);
+ p = (void *)0x4800003C; /* MCIOx */
+ printf("MCIO1 %x\n", *p);
+}
+
+/*
+ * u_int initarm(...)
+ *
+ * Initial entry point on startup. This gets called before main() is
+ * entered.
+ * It should be responsible for setting up everything that must be
+ * in place when main is called.
+ * This includes
+ * Taking a copy of the boot configuration structure.
+ * Initialising the physical console so characters can be printed.
+ * Setting up page tables for the kernel
+ * Relocating the kernel to the bottom of physical memory
+ */
+u_int
+initarm(void *arg)
+{
+ extern vaddr_t xscale_cache_clean_addr;
+ int loop;
+ int loop1;
+ u_int l1pagetable;
+ pv_addr_t kernel_l1pt;
+ paddr_t memstart;
+ psize_t memsize;
+
+#if 0
+ int led_data = 0;
+#endif
+#ifdef DIAGNOSTIC
+ extern vsize_t xscale_minidata_clean_size; /* used in KASSERT */
+#endif
+ struct bus_space tmp_bs_tag;
+ int (*map_func_save)(void *, bus_addr_t, bus_size_t, int,
+ bus_space_handle_t *);
+#if 0
+#define LEDSTEP_P() ioreg_write(LUBBOCK_OBIO_PBASE+LUBBOCK_HEXLED, led_data++)
+#define LEDSTEP() hex_led(led_data++)
+#else
+#define LEDSTEP_P()
+#define LEDSTEP()
+#endif
+
+
+
+ /* use physical address until pagetable is set */
+ LEDSTEP_P();
+
+#if 0
+ /* XXX */
+ /* start 32.768KHz OSC */
+ ioreg_write(PXA2X0_CLKMAN_BASE + 0x08, 2);
+#endif
+
+ /*
+ * Heads up ... Setup the CPU / MMU / TLB functions
+ */
+ if (set_cpufuncs())
+ panic("cpu not recognized!");
+ LEDSTEP_P();
+
+ /* Get ready for splfoo() */
+ pxa2x0_intr_bootstrap(PXA2X0_INTCTL_BASE);
+
+#if 0
+ /* Calibrate the delay loop. */
+#endif
+
+ /*
+ * Okay, RedBoot has provided us with the following memory map:
+ *
+ * Physical Address Range Description
+ * ----------------------- ----------------------------------
+ * 0x00000000 - 0x01ffffff flash Memory (32MB)
+ * 0x04000000 - 0x05ffffff Application flash Memory (32MB)
+ * 0x08000000 - 0x080000ff I/O baseboard registers
+ * 0x0a000000 - 0x0a0fffff SRAM (1MB)
+ * 0x0c000000 - 0x0c0fffff Ethernet Controller
+ * 0x0e000000 - 0x0e0fffff Ethernet Controller (Attribute)
+ * 0x10000000 - 0x103fffff SA-1111 Companion Chip
+ * 0x14000000 - 0x17ffffff Expansion Card (64MB)
+ * 0x40000000 - 0x480fffff Processor Registers
+ * 0xa0000000 - 0xa3ffffff SDRAM Bank 0 (64MB)
+ *
+ *
+ * Virtual Address Range X C B Description
+ * ----------------------- - - - ----------------------------------
+ * 0x00000000 - 0x00003fff N Y Y SDRAM
+ * 0x00004000 - 0x000fffff N Y N Boot ROM
+ * 0x00100000 - 0x01ffffff N N N Application Flash
+ * 0x04000000 - 0x05ffffff N N N Exp Application Flash
+ * 0x08000000 - 0x080fffff N N N I/O baseboard registers
+ * 0x0a000000 - 0x0a0fffff N N N SRAM
+ * 0x40000000 - 0x480fffff N N N Processor Registers
+ * 0xa0000000 - 0xa000ffff N Y N RedBoot SDRAM
+ * 0xa0017000 - 0xa3ffffff Y Y Y SDRAM
+ * 0xc0000000 - 0xcfffffff Y Y Y Cache Flush Region
+ * (done by this routine)
+ * 0xfd000000 - 0xfd0000ff N N N I/O baseboard registers
+ * 0xfd100000 - 0xfd2fffff N N N Processor Registers.
+ * 0xfd200000 - 0xfd2fffff N N N 0x10800000 registers
+ *
+ * The first level page table is at 0xa0004000. There are also
+ * 2 second-level tables at 0xa0008000 and 0xa0008400.
+ *
+ */
+
+ {
+ /*
+ * Tweak RedBoot's pagetable so that we can access to
+ * some registers at same VA before and after installing
+ * our page table.
+ */
+ paddr_t ttb = (paddr_t)read_ttb();
+
+ map_io_area(ttb);
+ cpu_tlb_flushD();
+ }
+
+ /* setup GPIO for BTUART, in case bootloader doesn't take care of it */
+ pxa2x0_gpio_bootstrap(LUBBOCK_GPIO_VBASE);
+#if 0
+ pxa2x0_gpio_set_function(42, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(43, GPIO_ALT_FN_2_OUT);
+ pxa2x0_gpio_set_function(44, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(45, GPIO_ALT_FN_2_OUT);
+
+ /* FFUART */
+ pxa2x0_gpio_set_function(34, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(39, GPIO_ALT_FN_2_OUT);
+ pxa2x0_gpio_set_function(35, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(40, GPIO_ALT_FN_2_OUT);
+ pxa2x0_gpio_set_function(41, GPIO_ALT_FN_2_OUT);
+#endif
+
+#if 1
+ /* turn on clock to UART block.
+ XXX: this should not be done here. */
+ ioreg_write(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN, CKEN_FFUART|CKEN_BTUART |
+ ioreg_read(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN));
+#endif
+
+ green_on(0);
+
+ LEDSTEP();
+
+ tmp_bs_tag = pxa2x0_bs_tag;
+ tmp_bs_tag.bs_map = bootstrap_bs_map;
+ map_func_save = pxa2x0_a4x_bs_tag.bs_map;
+ pxa2x0_a4x_bs_tag.bs_map = bootstrap_bs_map;
+
+ LEDSTEP();
+
+
+ consinit();
+ sysprobe();
+ LEDSTEP();
+#ifdef KGDB
+ kgdb_port_init();
+ LEDSTEP();
+#endif
+
+
+ /* Talk to the user */
+ printf("\nOpenBSD/zaurus booting ...\n");
+
+ /* Tweak memory controller */
+ {
+ /* Modify access timing for CS3 (91c96) */
+
+ uint32_t tmp =
+ ioreg_read(PXA2X0_MEMCTL_BASE+MEMCTL_MSC1);
+ ioreg_write(PXA2X0_MEMCTL_BASE+MEMCTL_MSC1,
+ (tmp & 0xffff) | (0x3881<<16));
+ /* RRR=3, RDN=8, RDF=8
+ * XXX: can be faster?
+ */
+ }
+
+
+ /* Initialize for PCMCIA/CF sockets */
+ {
+ uint32_t tmp;
+
+ /* Activate two sockets.
+ XXX: This code segment should be moved to
+ pcmcia MD attach routine.
+ XXX: These bits should be toggled based on
+ existene of PCMCIA/CF cards
+ */
+ ioreg_write(PXA2X0_MEMCTL_BASE+MEMCTL_MECR,
+ MECR_NOS|MECR_CIT);
+
+ tmp = ioreg_read(LUBBOCK_SACC_PBASE+SACCSBI_SKCR);
+ ioreg_write(LUBBOCK_SACC_PBASE+SACCSBI_SKCR,
+ (tmp & ~(1<<4)) | (1<<0));
+ }
+
+#if 0
+ /*
+ * Examine the boot args string for options we need to know about
+ * now.
+ */
+ process_kernel_args((char *)nwbootinfo.bt_args);
+#else
+ boothowto = RB_AUTOBOOT;
+#endif
+#ifdef RAMDISK_HOOKS
+ boothowto |= RB_DFLTROOT;
+#endif /* RAMDISK_HOOKS */
+
+
+ {
+ int processor_card_id;
+
+ processor_card_id = 0x000f &
+ ioreg_read(LUBBOCK_OBIO_VBASE+LUBBOCK_MISCRD);
+ switch(processor_card_id){
+ case 0:
+ /* Cotulla */
+ memstart = 0xa0000000;
+ memsize = 0x02000000; /* 32MB -phone */
+ memsize = 0x04000000; /* 64MB */
+ break;
+ case 1:
+ /* XXX: Sabiani */
+ memstart = 0xa0000000;
+ memsize = 0x04000000; /* 64MB */
+ break;
+ default:
+ /* XXX: Unknown */
+ memstart = 0xa0000000;
+ memsize = 0x04000000; /* 64MB */
+ }
+ }
+
+#if 0
+ {
+ volatile int *p;
+ char *membase;
+ char *memmax;
+ int chunksize = 0x02000000;
+ printf("probing memory");
+
+ membase = (char *)0xa0000000;
+ memmax = (char *)0xc0000000;
+ for (p = (int *)membase;
+ p < (int *)memmax;
+ p = (int *) (((char *)p) + chunksize)) {
+ printf ("cbase %p\n", p);
+ p[0] = 0x12345678;
+ p[1] = 0x12345678;
+ if ((p[0] != 0x12345678) || (p[1] != 0x12345678))
+ break;
+ }
+ memsize = ((char *)p) - membase;
+
+ printf("probing memory done found memsize %d\n", memsize);
+ }
+#else
+#endif
+
+#define DEBUG
+#ifdef DEBUG
+ printf("initarm: Configuring system ...\n");
+#endif
+
+ /* Fake bootconfig structure for the benefit of pmap.c */
+ /* XXX must make the memory description h/w independant */
+ bootconfig.dramblocks = 1;
+ bootconfig.dram[0].address = memstart;
+ bootconfig.dram[0].pages = memsize / PAGE_SIZE;
+
+ /*
+ * Set up the variables that define the availablilty of
+ * physical memory. For now, we're going to set
+ * physical_freestart to 0xa0200000 (where the kernel
+ * was loaded), and allocate the memory we need downwards.
+ * If we get too close to the page tables that RedBoot
+ * set up, we will panic. We will update physical_freestart
+ * and physical_freeend later to reflect what pmap_bootstrap()
+ * wants to see.
+ *
+ * XXX pmap_bootstrap() needs an enema.
+ */
+ physical_start = bootconfig.dram[0].address;
+ physical_end = physical_start + (bootconfig.dram[0].pages * PAGE_SIZE);
+
+ physical_freestart = 0xa0009000UL;
+ physical_freeend = 0xa0200000UL;
+
+ physmem = (physical_end - physical_start) / PAGE_SIZE;
+
+#ifdef DEBUG
+ /* Tell the user about the memory */
+ printf("physmemory: %d pages at 0x%08lx -> 0x%08lx\n", physmem,
+ physical_start, physical_end - 1);
+#endif
+
+ /*
+ * Okay, the kernel starts 2MB in from the bottom of physical
+ * memory. We are going to allocate our bootstrap pages downwards
+ * from there.
+ *
+ * We need to allocate some fixed page tables to get the kernel
+ * going. We allocate one page directory and a number of page
+ * tables and store the physical addresses in the kernel_pt_table
+ * array.
+ *
+ * The kernel page directory must be on a 16K boundary. The page
+ * tables must be on 4K bounaries. What we do is allocate the
+ * page directory on the first 16K boundary that we encounter, and
+ * the page tables on 4K boundaries otherwise. Since we allocate
+ * at least 3 L2 page tables, we are guaranteed to encounter at
+ * least one 16K aligned region.
+ */
+
+#ifdef VERBOSE_INIT_ARM
+ printf("Allocating page tables\n");
+#endif
+
+ free_pages = (physical_freeend - physical_freestart) / PAGE_SIZE;
+
+#ifdef VERBOSE_INIT_ARM
+ printf("freestart = 0x%08lx, free_pages = %d (0x%08x)\n",
+ physical_freestart, free_pages, free_pages);
+#endif
+
+ /* Define a macro to simplify memory allocation */
+#define valloc_pages(var, np) \
+ alloc_pages((var).pv_pa, (np)); \
+ (var).pv_va = KERNEL_BASE + (var).pv_pa - physical_start;
+
+#define alloc_pages(var, np) \
+ physical_freeend -= ((np) * PAGE_SIZE); \
+ if (physical_freeend < physical_freestart) \
+ panic("initarm: out of memory"); \
+ (var) = physical_freeend; \
+ free_pages -= (np); \
+ memset((char *)(var), 0, ((np) * PAGE_SIZE));
+
+ loop1 = 0;
+ kernel_l1pt.pv_pa = 0;
+ for (loop = 0; loop <= NUM_KERNEL_PTS; ++loop) {
+ /* Are we 16KB aligned for an L1 ? */
+ if (((physical_freeend - L1_TABLE_SIZE) & (L1_TABLE_SIZE - 1)) == 0
+ && kernel_l1pt.pv_pa == 0) {
+ valloc_pages(kernel_l1pt, L1_TABLE_SIZE / PAGE_SIZE);
+ } else {
+ valloc_pages(kernel_pt_table[loop1],
+ L2_TABLE_SIZE / PAGE_SIZE);
+ ++loop1;
+ }
+ }
+
+ /* This should never be able to happen but better confirm that. */
+ if (!kernel_l1pt.pv_pa || (kernel_l1pt.pv_pa & (L1_TABLE_SIZE-1)) != 0)
+ panic("initarm: Failed to align the kernel page directory");
+
+ LEDSTEP();
+
+ /*
+ * Allocate a page for the system page mapped to V0x00000000
+ * This page will just contain the system vectors and can be
+ * shared by all processes.
+ */
+ alloc_pages(systempage.pv_pa, 1);
+
+ /* Allocate stacks for all modes */
+ valloc_pages(irqstack, IRQ_STACK_SIZE);
+ valloc_pages(abtstack, ABT_STACK_SIZE);
+ valloc_pages(undstack, UND_STACK_SIZE);
+ valloc_pages(kernelstack, UPAGES);
+
+ /* Allocate enough pages for cleaning the Mini-Data cache. */
+ KASSERT(xscale_minidata_clean_size <= PAGE_SIZE);
+ valloc_pages(minidataclean, 1);
+
+#ifdef VERBOSE_INIT_ARM
+ printf("IRQ stack: p0x%08lx v0x%08lx\n", irqstack.pv_pa,
+ irqstack.pv_va);
+ printf("ABT stack: p0x%08lx v0x%08lx\n", abtstack.pv_pa,
+ abtstack.pv_va);
+ printf("UND stack: p0x%08lx v0x%08lx\n", undstack.pv_pa,
+ undstack.pv_va);
+ printf("SVC stack: p0x%08lx v0x%08lx\n", kernelstack.pv_pa,
+ kernelstack.pv_va);
+#endif
+
+ /*
+ * XXX Defer this to later so that we can reclaim the memory
+ * XXX used by the RedBoot page tables.
+ */
+ alloc_pages(msgbufphys, round_page(MSGBUFSIZE) / PAGE_SIZE);
+
+ /*
+ * Ok we have allocated physical pages for the primary kernel
+ * page tables
+ */
+
+#ifdef VERBOSE_INIT_ARM
+ printf("Creating L1 page table at 0x%08lx\n", kernel_l1pt.pv_pa);
+#endif
+
+ /*
+ * Now we start construction of the L1 page table
+ * We start by mapping the L2 page tables into the L1.
+ * This means that we can replace L1 mappings later on if necessary
+ */
+ l1pagetable = kernel_l1pt.pv_pa;
+
+ /* Map the L2 pages tables in the L1 page table */
+ pmap_link_l2pt(l1pagetable, 0x00000000,
+ &kernel_pt_table[KERNEL_PT_SYS]);
+
+ for (loop = 0; loop < KERNEL_PT_KERNEL_NUM; loop++)
+ pmap_link_l2pt(l1pagetable, KERNEL_BASE + loop * 0x00400000,
+ &kernel_pt_table[KERNEL_PT_KERNEL + loop]);
+
+ for (loop = 0; loop < KERNEL_PT_VMDATA_NUM; loop++)
+ pmap_link_l2pt(l1pagetable, KERNEL_VM_BASE + loop * 0x00400000,
+ &kernel_pt_table[KERNEL_PT_VMDATA + loop]);
+
+ /* update the top of the kernel VM */
+ pmap_curmaxkvaddr =
+ KERNEL_VM_BASE + (KERNEL_PT_VMDATA_NUM * 0x00400000);
+
+#ifdef VERBOSE_INIT_ARM
+ printf("Mapping kernel\n");
+#endif
+
+ /* Now we fill in the L2 pagetable for the kernel static code/data */
+ {
+ extern char etext[], _end[];
+ size_t textsize = (u_int32_t) etext - KERNEL_TEXT_BASE;
+ size_t totalsize = (u_int32_t) _end - KERNEL_TEXT_BASE;
+ u_int logical;
+
+ textsize = (textsize + PGOFSET) & ~PGOFSET;
+ totalsize = (totalsize + PGOFSET) & ~PGOFSET;
+
+ logical = 0x00200000; /* offset of kernel in RAM */
+
+ logical += pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
+ physical_start + logical, textsize,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+ logical += pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
+ physical_start + logical, totalsize - textsize,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+ }
+
+#ifdef VERBOSE_INIT_ARM
+ printf("Constructing L2 page tables\n");
+#endif
+
+ /* Map the stack pages */
+ pmap_map_chunk(l1pagetable, irqstack.pv_va, irqstack.pv_pa,
+ IRQ_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+ pmap_map_chunk(l1pagetable, abtstack.pv_va, abtstack.pv_pa,
+ ABT_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+ pmap_map_chunk(l1pagetable, undstack.pv_va, undstack.pv_pa,
+ UND_STACK_SIZE * PAGE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+ pmap_map_chunk(l1pagetable, kernelstack.pv_va, kernelstack.pv_pa,
+ UPAGES * PAGE_SIZE, VM_PROT_READ | VM_PROT_WRITE, PTE_CACHE);
+
+ pmap_map_chunk(l1pagetable, kernel_l1pt.pv_va, kernel_l1pt.pv_pa,
+ L1_TABLE_SIZE, VM_PROT_READ | VM_PROT_WRITE, PTE_PAGETABLE);
+
+ for (loop = 0; loop < NUM_KERNEL_PTS; ++loop) {
+ pmap_map_chunk(l1pagetable, kernel_pt_table[loop].pv_va,
+ kernel_pt_table[loop].pv_pa, L2_TABLE_SIZE,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
+ }
+
+ /* Map the Mini-Data cache clean area. */
+ xscale_setup_minidata(l1pagetable, minidataclean.pv_va,
+ minidataclean.pv_pa);
+
+ /* Map the vector page. */
+#if 1
+ /* MULTI-ICE requires that page 0 is NC/NB so that it can download the
+ * cache-clean code there. */
+ pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
+#else
+ pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+#endif
+
+ /*
+ * map integrated peripherals at same address in l1pagetable
+ * so that we can continue to use console.
+ */
+ copy_io_area_map((pd_entry_t *)l1pagetable);
+
+ /*
+ * Give the XScale global cache clean code an appropriately
+ * sized chunk of unmapped VA space starting at 0xff000000
+ * (our device mappings end before this address).
+ */
+ xscale_cache_clean_addr = 0xff000000U;
+
+ /*
+ * Now we have the real page tables in place so we can switch to them.
+ * Once this is done we will be running with the REAL kernel page
+ * tables.
+ */
+
+ /*
+ * Update the physical_freestart/physical_freeend/free_pages
+ * variables.
+ */
+ {
+ extern char _end[];
+
+ physical_freestart = physical_start +
+ (((((u_int32_t) _end) + PGOFSET) & ~PGOFSET) -
+ KERNEL_BASE);
+ physical_freeend = physical_end;
+ free_pages =
+ (physical_freeend - physical_freestart) / PAGE_SIZE;
+ }
+
+ /* be a client to all domains */
+ cpu_domains(0x55555555);
+ /* Switch tables */
+#ifdef VERBOSE_INIT_ARM
+ printf("freestart = 0x%08lx, free_pages = %d (0x%x)\n",
+ physical_freestart, free_pages, free_pages);
+ printf("switching to new L1 page table @%#lx...", kernel_l1pt.pv_pa);
+#endif
+
+ LEDSTEP();
+
+ /* set new intc register address so that splfoo() doesn't
+ touch illegal address. */
+ pxa2x0_intr_bootstrap(LUBBOCK_INTCTL_VBASE);
+
+ LEDSTEP();
+
+ cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT);
+ setttb(kernel_l1pt.pv_pa);
+ cpu_tlb_flushID();
+ cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2));
+ LEDSTEP();
+
+ /*
+ * Moved from cpu_startup() as data_abort_handler() references
+ * this during uvm init
+ */
+ proc0paddr = (struct user *)kernelstack.pv_va;
+ proc0.p_addr = proc0paddr;
+
+#ifdef VERBOSE_INIT_ARM
+ printf("bootstrap done.\n");
+#endif
+
+ if (boothowto & RB_CONFIG) {
+#ifdef BOOT_CONFIG
+ user_config();
+#else
+ printf("kernel does not support -c; continuing..\n");
+#endif
+ }
+
+
+ arm32_vector_init(ARM_VECTORS_LOW, ARM_VEC_ALL);
+
+ /*
+ * Pages were allocated during the secondary bootstrap for the
+ * stacks for different CPU modes.
+ * We must now set the r13 registers in the different CPU modes to
+ * point to these stacks.
+ * Since the ARM stacks use STMFD etc. we must set r13 to the top end
+ * of the stack memory.
+ */
+#ifdef VERBOSE_INIT_ARM
+ printf("init subsystems: stacks ");
+#endif
+
+ set_stackptr(PSR_IRQ32_MODE,
+ irqstack.pv_va + IRQ_STACK_SIZE * PAGE_SIZE);
+ set_stackptr(PSR_ABT32_MODE,
+ abtstack.pv_va + ABT_STACK_SIZE * PAGE_SIZE);
+ set_stackptr(PSR_UND32_MODE,
+ undstack.pv_va + UND_STACK_SIZE * PAGE_SIZE);
+
+ /*
+ * Well we should set a data abort handler.
+ * Once things get going this will change as we will need a proper
+ * handler.
+ * Until then we will use a handler that just panics but tells us
+ * why.
+ * Initialisation of the vectors will just panic on a data abort.
+ * This just fills in a slighly better one.
+ */
+#ifdef VERBOSE_INIT_ARM
+ printf("vectors ");
+#endif
+ data_abort_handler_address = (u_int)data_abort_handler;
+ prefetch_abort_handler_address = (u_int)prefetch_abort_handler;
+ undefined_handler_address = (u_int)undefinedinstruction_bounce;
+
+ /* Initialise the undefined instruction handlers */
+#ifdef VERBOSE_INIT_ARM
+ printf("undefined ");
+#endif
+ undefined_init();
+
+ /* Load memory into UVM. */
+#ifdef VERBOSE_INIT_ARM
+ printf("page ");
+#endif
+ uvm_setpagesize(); /* initialize PAGE_SIZE-dependent variables */
+ uvm_page_physload(atop(physical_freestart), atop(physical_freeend),
+ atop(physical_freestart), atop(physical_freeend),
+ VM_FREELIST_DEFAULT);
+
+ /* Boot strap pmap telling it where the kernel page table is */
+#ifdef VERBOSE_INIT_ARM
+ printf("pmap ");
+#endif
+ LEDSTEP();
+ pmap_bootstrap((pd_entry_t *)kernel_l1pt.pv_va, KERNEL_VM_BASE,
+ KERNEL_VM_BASE + KERNEL_VM_SIZE);
+ LEDSTEP();
+
+#ifdef __HAVE_MEMORY_DISK__
+ md_root_setconf(memory_disk, sizeof memory_disk);
+#endif
+
+#if 0
+ /* XXX - drahn */
+ {
+ uint16_t sw = ioreg16_read(LUBBOCK_OBIO_VBASE+LUBBOCK_USERSW);
+
+ if (0 == (sw & (1<<13))) /* check S19 */
+ boothowto |= RB_KDB;
+ if (0 == (sw & (1<<12))) /* S20 */
+ boothowto |= RB_SINGLE;
+ }
+#endif
+
+ LEDSTEP();
+
+#ifdef IPKDB
+ /* Initialise ipkdb */
+ ipkdb_init();
+ if (boothowto & RB_KDB)
+ ipkdb_connect(0);
+#endif
+
+#ifdef KGDB
+ if (boothowto & RB_KDB) {
+ kgdb_debug_init = 1;
+ kgdb_connect(1);
+ }
+#endif
+
+#ifdef DDB
+ db_machine_init();
+
+ /* Firmware doesn't load symbols. */
+ ddb_init();
+
+ if (boothowto & RB_KDB)
+ Debugger();
+#endif
+
+ pxa2x0_a4x_bs_tag.bs_map = map_func_save ;
+
+ /* We return the new stack pointer address */
+ return(kernelstack.pv_va + USPACE_SVC_STACK_TOP);
+}
+
+#if 0
+void
+process_kernel_args(char *args)
+{
+
+ boothowto = 0;
+
+ /* Make a local copy of the bootargs */
+ strncpy(bootargs, args, MAX_BOOT_STRING);
+
+ args = bootargs;
+ boot_file = bootargs;
+
+ /* Skip the kernel image filename */
+ while (*args != ' ' && *args != 0)
+ ++args;
+
+ if (*args != 0)
+ *args++ = 0;
+
+ while (*args == ' ')
+ ++args;
+
+ boot_args = args;
+
+ printf("bootfile: %s\n", boot_file);
+ printf("bootargs: %s\n", boot_args);
+
+ parse_mi_bootargs(boot_args);
+}
+#endif
+
+#ifdef KGDB
+#ifndef KGDB_DEVNAME
+#define KGDB_DEVNAME "ffuart"
+#endif
+const char kgdb_devname[] = KGDB_DEVNAME;
+
+#if (NCOM > 0)
+#ifndef KGDB_DEVMODE
+#define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */
+#endif
+int comkgdbmode = KGDB_DEVMODE;
+#endif /* NCOM */
+
+#endif /* KGDB */
+
+
+void
+consinit(void)
+{
+ static int consinit_called = 0;
+ uint32_t ckenreg = ioreg_read(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN);
+#if 0
+ char *console = CONSDEVNAME;
+#endif
+
+ if (consinit_called != 0)
+ return;
+
+ consinit_called = 1;
+
+#if NCOM > 0
+
+#ifdef FFUARTCONSOLE
+ /* Check switch. */
+ /*
+ if (0 == (ioreg_read(LUBBOCK_OBIO_VBASE+LUBBOCK_USERSW) & (1<<15))) {
+ */
+ if (0) {
+ /* We don't use FF serial when S17=no-dot position */
+ }
+#ifdef KGDB
+ else if (0 == strcmp(kgdb_devname, "ffuart")) {
+ /* port is reserved for kgdb */
+ }
+#endif
+ else if (0 == comcnattach(&pxa2x0_a4x_bs_tag, PXA2X0_FFUART_BASE,
+ comcnspeed, PXA2X0_COM_FREQ, comcnmode)) {
+#if 0
+ /* XXX: can't call pxa2x0_clkman_config yet */
+ pxa2x0_clkman_config(CKEN_FFUART, 1);
+#else
+ ioreg_write(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN,
+ ckenreg|CKEN_FFUART);
+#endif
+
+ return;
+ }
+#endif /* FFUARTCONSOLE */
+
+#ifdef BTUARTCONSOLE
+#ifdef KGDB
+ if (0 == strcmp(kgdb_devname, "btuart")) {
+ /* port is reserved for kgdb */
+ } else
+#endif
+ if (0 == comcnattach(&pxa2x0_a4x_bs_tag, PXA2X0_BTUART_BASE,
+ comcnspeed, PXA2X0_COM_FREQ, comcnmode)) {
+ ioreg_write(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN,
+ ckenreg|CKEN_BTUART);
+ return;
+ }
+#endif /* BTUARTCONSOLE */
+
+
+#endif /* NCOM */
+
+}
+
+#ifdef KGDB
+void
+kgdb_port_init(void)
+{
+#if (NCOM > 0) && defined(COM_PXA2X0)
+ paddr_t paddr = 0;
+ enum pxa2x0_uart_id uart_id;
+ uint32_t ckenreg = ioreg_read(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN);
+
+ if (0 == strcmp(kgdb_devname, "ffuart")) {
+ paddr = PXA2X0_FFUART_BASE;
+ clenreg |= CKEN_FFUART;
+ }
+ else if (0 == strcmp(kgdb_devname, "btuart")) {
+ paddr = PXA2X0_BTUART_BASE;
+ clenreg |= CKEN_BTUART;
+ }
+
+ if (paddr &&
+ 0 == com_kgdb_attach_pxa2x0(&pxa2x0_a4x_bs_tag, paddr,
+ kgdb_rate, PXA2X0_COM_FREQ, COM_TYPE_PXA2x0, comkgdbmode)) {
+
+ ioreg_write(LUBBOCK_CLKMAN_VBASE+CLKMAN_CKEN, ckenreg);
+ }
+#endif
+}
+#endif
+
+#if 0
+/*
+ * display a number in hex LED.
+ * a digit is blank when the corresponding bit in arg blank is 1
+ */
+unsigned short led_control_value = 0;
+
+void
+hex_led_blank(uint32_t value, int blank)
+{
+ int save = disable_interrupts(I32_bit);
+
+ ioreg_write(LUBBOCK_OBIO_VBASE+0x10, value);
+ led_control_value = (led_control_value & 0xff)
+ | ((blank & 0xff)<<8);
+ ioreg_write(LUBBOCK_OBIO_VBASE+0x40, led_control_value);
+ restore_interrupts(save);
+}
+#endif
+
+/*
+ * Cotulla's integrated ICU doesn't have IRQ0..7, so
+ * we map software interrupts to bit 0..3
+ */
+#define SI_TO_IRQBIT(si) (1U<<(si))
+
+void
+pxa2x0_setipl(int new)
+{
+ current_spl_level = new;
+ intr_mask = pxa2x0_imask[current_spl_level];
+ write_icu( SAIPIC_MR, intr_mask );
+}
+
+
+void
+pxa2x0_splx(int new)
+{
+ int psw;
+
+ psw = disable_interrupts(I32_bit);
+ pxa2x0_setipl(new);
+ restore_interrupts(psw);
+
+ /* If there are software interrupts to process, do it. */
+ if (softint_pending & intr_mask)
+ pxa2x0_do_pending();
+}
+
+
+int
+pxa2x0_splraise(int ipl)
+{
+ int old, psw;
+
+ old = current_spl_level;
+ if( ipl > current_spl_level ){
+ psw = disable_interrupts(I32_bit);
+ pxa2x0_setipl(ipl);
+ restore_interrupts(psw);
+ }
+
+ return (old);
+}
+
+int
+pxa2x0_spllower(int ipl)
+{
+ int old = current_spl_level;
+ int psw = disable_interrupts(I32_bit);
+ pxa2x0_splx(ipl);
+ restore_interrupts(psw);
+ return(old);
+}
+
+void
+pxa2x0_setsoftintr(int si)
+{
+ #if 0
+ atomic_set_bit( (u_int *)&softint_pending, SI_TO_IRQBIT(si) );
+ #else
+ softint_pending |= SI_TO_IRQBIT(si);
+ #endif
+
+ /* Process unmasked pending soft interrupts. */
+ if ( softint_pending & intr_mask )
+ pxa2x0_do_pending();
+}
diff --git a/sys/arch/zaurus/zaurus/zaurus_reg.h b/sys/arch/zaurus/zaurus/zaurus_reg.h
new file mode 100644
index 00000000000..d40043cf7c8
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/zaurus_reg.h
@@ -0,0 +1,96 @@
+/* $NetBSD: lubbock_reg.h,v 1.1 2003/06/18 10:51:15 bsh Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#ifndef _EVBARM_LUBBOCK_REG_H
+#define _EVBARM_LUBBOCK_REG_H
+
+#include <arm/xscale/pxa2x0reg.h>
+
+/* lubbock on-board IOs */
+#define LUBBOCK_OBIO_PBASE PXA2X0_CS2_START /* Physical address */
+#define LUBBOCK_OBIO_SIZE 0x00000100
+
+#define LUBBOCK_SRAM_PBASE (PXA2X0_CS2_START+0x02000000)
+#define LUBBOCK_SRAM_SIZE 0x00100000
+
+#define LUBBOCK_91C96_PBASE PXA2X0_CS3_START
+#define LUBBOCK_91C96_IO LUBBOCK_91C96_PBASE
+#define LUBBOCK_91C96_ATTRMEM (LUBBOCK_91C96_PBASE+0x02000000)
+
+
+/* SA-1111 companion chip registers */
+#define LUBBOCK_SACC_PBASE PXA2X0_CS4_START
+
+/*
+ * Logical mapping for onboard/integrated peripherals
+ */
+#define LUBBOCK_IO_AREA_VBASE 0xfd000000
+#define LUBBOCK_OBIO_VBASE 0xfd000000
+#define LUBBOCK_GPIO_VBASE 0xfd100000
+#define LUBBOCK_CLKMAN_VBASE 0xfd200000
+#define LUBBOCK_INTCTL_VBASE 0xfd300000
+#define LUBBOCK_AGPIO_VBASE 0xfd400000
+#define LUBBOCK_VBASE_FREE 0xfd500000
+/* FFUART and/or BTUART are mapped to this area when
+ used for console or kgdb port */
+
+/*
+ * Onboard register address
+ * (offset from LUBBOCK_OBIO_PBASE)
+ */
+#define LUBBOCK_SYSTEMID 0x0000
+#define LUBBOCK_HEXLED 0x0010
+#define LUBBOCK_LEDCTL 0x0040
+#define LUBBOCK_CONFIGSW 0x0050
+#define LUBBOCK_USERSW 0x0060
+#define LUBBOCK_MISCWR 0x0080
+#define MISCWR_S1PWR (3U<<14)
+#define MISCWR_LCDDISP (1U<<8)
+#define MISCWR_IRDAMODE (1U<<4) /* 1=FIR, 0=SIR */
+#define MISCWR_GREENLED (1U<<3)
+#define MISCWR_ENETEN16 (1U<<2)
+#define MISCWR_PCRESET (1U<<1) /* Processor card reset */
+#define MSICWR_SYSRESET (1U<<0)
+#define LUBBOCK_MISCRD 0x0090
+#define LUBBOCK_INTRMASK 0x00c0
+#define LUBBOCK_INTRCTL 0x00d0
+
+#define ioreg_read(a) (*(volatile unsigned *)(a))
+#define ioreg_write(a,v) (*(volatile unsigned *)(a)=(v))
+
+#define ioreg16_read(a) (*(volatile uint16_t *)(a))
+#define ioreg16_write(a,v) (*(volatile uint16_t *)(a)=(v))
+
+#define ioreg8_read(a) (*(volatile uint8_t *)(a))
+#define ioreg8_write(a,v) (*(volatile uint8_t *)(a)=(v))
+
+#endif /* _EVBARM_LUBBOCK_REG_H */
diff --git a/sys/arch/zaurus/zaurus/zaurus_start.S b/sys/arch/zaurus/zaurus/zaurus_start.S
new file mode 100644
index 00000000000..695e0a5fc40
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/zaurus_start.S
@@ -0,0 +1,174 @@
+/* $NetBSD: lubbock_start.S,v 1.1 2003/06/18 10:51:15 bsh Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <machine/asm.h>
+#include <arm/armreg.h>
+#include <arm/pte.h>
+#include <arm/pmap.h> /* for PMAP_DOMAIN_KERNEL */
+
+#ifndef SDRAM_START
+#define SDRAM_START 0xa0000000
+#endif
+
+/*
+ * CPWAIT -- Canonical method to wait for CP15 update.
+ * NOTE: Clobbers the specified temp reg.
+ * copied from arm/arm/cpufunc_asm_xscale.S
+ * XXX: better be in a common header file.
+ */
+#define CPWAIT_BRANCH \
+ sub pc, pc, #4
+
+#define CPWAIT(tmp) \
+ mrc p15, 0, tmp, c2, c0, 0 /* arbitrary read of CP15 */ ;\
+ mov tmp, tmp /* wait for it to complete */ ;\
+ CPWAIT_BRANCH /* branch to next insn */
+
+/*
+ * Kernel start routine for DBPXA250 (Lubbock)
+ * this code is excuted at the very first after the kernel is loaded
+ * by RedBoot.
+ */
+ .text
+
+ .global _C_LABEL(zaurus_start)
+_C_LABEL(zaurus_start):
+ /* Are we running on ROM ? */
+ cmp pc, #0x06000000
+ bhi zaurus_start_ram
+
+ /* move me to RAM
+ * XXX: we can use memcpy if it is PIC
+ */
+ ldr r1, Lcopy_size
+ adr r0, _C_LABEL(zaurus_start)
+ add r1, r1, #3
+ mov r1, r1, LSR #2
+ mov r2, #SDRAM_START
+ add r2, r2, #0x00200000
+ mov r4, r2
+
+5: ldr r3,[r0],#4
+ str r3,[r2],#4
+ subs r1,r1,#1
+ bhi 5b
+
+ cmp pc, r5
+ /* Jump to RAM */
+ ldr r0, Lstart_off
+
+ blo 1f
+ /* if we were running out of virtual mapped space, disable mmu */
+ mov r2, #0
+ mov r1, #(CPU_CONTROL_32BP_ENABLE | CPU_CONTROL_32BD_ENABLE)
+ mcr 15, 0, r1, c1, c0, 0
+ mcrne 15, 0, r2, c8, c7, 0 /* nail I+D TLB on ARMv4 and greater */
+
+1:
+ add pc, r4, r0
+
+Lcopy_size: .word _edata-_C_LABEL(zaurus_start)
+Lstart_off: .word zaurus_start_ram-_C_LABEL(zaurus_start)
+
+zaurus_start_ram:
+ /*
+ * Kernel is loaded in SDRAM (0xa0200000..), and is expected to run
+ * in VA 0xc0200000..
+ */
+
+ mrc p15, 0, r0, c2, c0, 0 /* get ttb prepared by redboot */
+ adr r4, mmu_init_table2
+
+#define BUILD_STARTUP_PAGETABLE
+#ifdef BUILD_STARTUP_PAGETABLE
+ mrc p15, 0, r2, c1, c0, 0
+ mov r2, #0
+ tst r2, #CPU_CONTROL_MMU_ENABLE /* we already have a page table? */
+ bne 3f
+
+ /* build page table from scratch */
+ ldr r0, Lstartup_pagetable
+ adr r4, mmu_init_table
+ b 3f
+
+2:
+ str r3, [r0, r2]
+ add r2, r2, #4
+ add r3, r3, #(L1_S_SIZE)
+ adds r1, r1, #-1
+ bhi 2b
+3:
+ ldmia r4!, {r1,r2,r3} /* # of sections, PA|attr, VA */
+ cmp r1, #0
+ bne 2b
+#endif
+
+ mcr p15, 0, r0, c2, c0, 0 /* Set TTB */
+ mcr p15, 0, r0, c8, c7, 0 /* Flush TLB */
+
+ /* Set the Domain Access register. Very important! */
+ mov r0, #((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL*2)) | DOMAIN_CLIENT)
+ mcr p15, 0, r0, c3, c0, 0
+
+ /* Enable MMU */
+ mrc p15, 0, r0, c1, c0, 0
+ orr r0, r0, #CPU_CONTROL_MMU_ENABLE
+ mcr p15, 0, r0, c1, c0, 0
+ CPWAIT(r0)
+
+ /* Jump to kernel code in TRUE VA */
+ adr r0, Lstart
+ ldr pc, [r0]
+
+Lstart:
+ .word start
+
+#define MMU_INIT(va,pa,n_sec,attr) \
+ .word n_sec ; \
+ .word 4*((va)>>L1_S_SHIFT) ; \
+ .word (pa)|(attr) ;
+
+#ifdef BUILD_STARTUP_PAGETABLE
+#ifndef STARTUP_PAGETABLE_ADDR
+#define STARTUP_PAGETABLE_ADDR 0xa0004000
+#endif
+Lstartup_pagetable: .word STARTUP_PAGETABLE_ADDR
+mmu_init_table:
+ /* fill all table VA==PA */
+ MMU_INIT(0x00000000, 0x00000000, 1<<(32-L1_S_SHIFT), L1_TYPE_S|L1_S_AP(AP_KRW))
+ /* map SDRAM VA==PA, WT cacheable */
+ MMU_INIT(SDRAM_START, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
+#endif
+mmu_init_table2:
+ /* map VA 0xc0000000..0xc3ffffff to PA 0xa0000000..0xa3ffffff */
+ MMU_INIT(0xc0000000, SDRAM_START, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
+
+ .word 0 /* end of table */
diff --git a/sys/arch/zaurus/zaurus/zaurus_var.h b/sys/arch/zaurus/zaurus/zaurus_var.h
new file mode 100644
index 00000000000..4455328bf36
--- /dev/null
+++ b/sys/arch/zaurus/zaurus/zaurus_var.h
@@ -0,0 +1,100 @@
+/* $NetBSD: lubbock_var.h,v 1.1 2003/06/18 10:51:15 bsh Exp $ */
+
+/*
+ * Copyright (c) 2002, 2003 Genetec Corporation. All rights reserved.
+ * Written by Hiroyuki Bessho for Genetec Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of Genetec Corporation may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef _EVBARM_LUBBOCK_VAR_H
+#define _EVBARM_LUBBOCK_VAR_H
+
+#include <sys/conf.h>
+#include <sys/device.h>
+
+#include <machine/bus.h>
+#include <machine/zaurus_reg.h>
+
+
+/*
+ * Lubbock on-board IO bus
+ */
+#define N_OBIO_IRQ 8
+
+struct obio_softc {
+ struct device sc_dev;
+ bus_space_tag_t sc_iot;
+ bus_space_handle_t sc_obioreg_ioh;
+ void *sc_ih; /* interrupt handler for obio on pxaip */
+ void *sc_si; /* software interrupt handler */
+ int sc_intr;
+ int sc_obio_intr_mask;
+ int sc_obio_intr_pending;
+ int sc_ipl; /* Max ipl among sub interrupts */
+ struct obio_handler {
+ int (* func)(void *);
+ void *arg;
+ int level;
+ } sc_handler[N_OBIO_IRQ];
+};
+
+typedef void *obio_chipset_tag_t;
+
+struct obio_attach_args {
+ obio_chipset_tag_t oba_sc;
+ bus_space_tag_t oba_iot; /* Bus tag */
+ bus_addr_t oba_addr; /* i/o address */
+ int oba_intr;
+};
+
+/* on-board hex LED */
+void hex_led_blank( uint32_t value, int blank );
+#define hex_led(value) ioreg_write( LUBBOCK_OBIO_VBASE+LUBBOCK_HEXLED, (value) )
+#define hex_led_p(value) ioreg_write( LUBBOCK_OBIO_PBASE+LUBBOCK_HEXLED, (value) )
+
+#define d_led(value) ioreg16_write( LUBBOCK_OBIO_VBASE+LUBBOCK_LEDCTL, (value) )
+
+/*
+ * IRQ handler
+ */
+void *obio_intr_establish(struct obio_softc *, int, int, int (*)(void *), void *);
+void obio_intr_disestablish(void *);
+
+#define obio_read(offset) ioreg_read(LUBBOCK_OBIO_VBASE+(offset))
+#define obio_write(offset,value) \
+ ioreg_write(LUBBOCK_OBIO_VBASE+(offset), (value))
+
+
+#define obio16_read(offset) ioreg16_read(LUBBOCK_OBIO_VBASE+(offset))
+#define obio16_write(offset,value) \
+ ioreg16_write(LUBBOCK_OBIO_VBASE+(offset), (value))
+
+#define obio8_read(offset) ioreg8_read(LUBBOCK_OBIO_VBASE+(offset))
+#define obio8_write(offset,value) \
+ ioreg8_write(LUBBOCK_OBIO_VBASE+(offset), (value))
+
+
+#endif /* _EVBARM_LUBBOCK_VAR_H */