summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMarek Vasut <marex@cvs.openbsd.org>2009-09-05 01:22:12 +0000
committerMarek Vasut <marex@cvs.openbsd.org>2009-09-05 01:22:12 +0000
commitd1cc7e6467991909c848131c2418e5879c85412d (patch)
treec389ccf0ca21fc4df81f23ef6137508c8421667f /sys/arch
parentfce0339e25d60b70523c3fd6ca778dff89e93720 (diff)
Palm: initial commit of sys/arch/palm
OK deraadt@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/palm/Makefile37
-rw-r--r--sys/arch/palm/compile/.cvsignore2
-rw-r--r--sys/arch/palm/conf/GENERIC227
-rw-r--r--sys/arch/palm/conf/Makefile.palm213
-rw-r--r--sys/arch/palm/conf/RAMDISK171
-rw-r--r--sys/arch/palm/conf/files.palm92
-rw-r--r--sys/arch/palm/dev/palm_hdd.c86
-rw-r--r--sys/arch/palm/dev/palm_kpc.c91
-rw-r--r--sys/arch/palm/dev/palm_mmc.c90
-rw-r--r--sys/arch/palm/dev/palm_udc.c91
-rw-r--r--sys/arch/palm/include/_types.h11
-rw-r--r--sys/arch/palm/include/apmvar.h1
-rw-r--r--sys/arch/palm/include/asm.h4
-rw-r--r--sys/arch/palm/include/atomic.h10
-rw-r--r--sys/arch/palm/include/bootconfig.h76
-rw-r--r--sys/arch/palm/include/bus.h4
-rw-r--r--sys/arch/palm/include/cdefs.h3
-rw-r--r--sys/arch/palm/include/conf.h18
-rw-r--r--sys/arch/palm/include/cpu.h4
-rw-r--r--sys/arch/palm/include/db_machdep.h4
-rw-r--r--sys/arch/palm/include/disklabel.h3
-rw-r--r--sys/arch/palm/include/endian.h4
-rw-r--r--sys/arch/palm/include/exec.h3
-rw-r--r--sys/arch/palm/include/float.h4
-rw-r--r--sys/arch/palm/include/fp.h4
-rw-r--r--sys/arch/palm/include/frame.h4
-rw-r--r--sys/arch/palm/include/ieee.h4
-rw-r--r--sys/arch/palm/include/ieeefp.h4
-rw-r--r--sys/arch/palm/include/internal_types.h7
-rw-r--r--sys/arch/palm/include/intr.h104
-rw-r--r--sys/arch/palm/include/limits.h4
-rw-r--r--sys/arch/palm/include/loadfile_machdep.h52
-rw-r--r--sys/arch/palm/include/lock.h4
-rw-r--r--sys/arch/palm/include/machine_reg.h67
-rw-r--r--sys/arch/palm/include/mutex.h3
-rw-r--r--sys/arch/palm/include/palm_var.h68
-rw-r--r--sys/arch/palm/include/param.h51
-rw-r--r--sys/arch/palm/include/pcb.h4
-rw-r--r--sys/arch/palm/include/pio.h4
-rw-r--r--sys/arch/palm/include/pmap.h4
-rw-r--r--sys/arch/palm/include/proc.h4
-rw-r--r--sys/arch/palm/include/profile.h4
-rw-r--r--sys/arch/palm/include/psl.h1
-rw-r--r--sys/arch/palm/include/ptrace.h4
-rw-r--r--sys/arch/palm/include/reg.h4
-rw-r--r--sys/arch/palm/include/reloc.h2
-rw-r--r--sys/arch/palm/include/setjmp.h4
-rw-r--r--sys/arch/palm/include/signal.h4
-rw-r--r--sys/arch/palm/include/spinlock.h7
-rw-r--r--sys/arch/palm/include/stdarg.h4
-rw-r--r--sys/arch/palm/include/sysarch.h4
-rw-r--r--sys/arch/palm/include/trap.h4
-rw-r--r--sys/arch/palm/include/vmparam.h86
-rw-r--r--sys/arch/palm/palm/autoconf.c147
-rw-r--r--sys/arch/palm/palm/palm_lcd.c249
-rw-r--r--sys/arch/palm/palm/palm_machdep.c1252
-rw-r--r--sys/arch/palm/palm/palm_start.S172
57 files changed, 3589 insertions, 0 deletions
diff --git a/sys/arch/palm/Makefile b/sys/arch/palm/Makefile
new file mode 100644
index 00000000000..182ab41dd5d
--- /dev/null
+++ b/sys/arch/palm/Makefile
@@ -0,0 +1,37 @@
+# $OpenBSD: Makefile,v 1.1 2009/09/05 01:22:11 marex Exp $
+# $NetBSD: Makefile,v 1.1 2001/06/12 08:32:46 chris Exp $
+
+# Makefile for palm tags file and boot blocks
+
+S=${.CURDIR}/../..
+.include "$S/kern/Make.tags.inc"
+
+NOPROG= noprog
+NOMAN= noman
+
+TPALM= $S/arch/palm/tags
+
+SPALM= $S/arch/palm/include/*.h \
+ $S/arch/palm/palm/*.[ch] $S/arch/arm/arm/*.[ch] \
+ $S/arch/arm/include/*.h $S/arch/arm/mainbus/*.[ch] \
+ $S/arch/arm/sa11x0/*.[ch] $S/arch/arm/xscale/*.[ch]
+APALM= $S/arch/palm/palm/*.S $S/arch/arm/arm/*.S \
+ $S/arch/arm/mainbus/*.S $S/arch/arm/xscale/*.S
+
+# Directories in which to place tags links
+DPALM= include palm
+
+tags:
+ -ctags -wdtf ${TPALM} ${SPALM} ${COMM}
+ egrep "^ENTRY(.*)|^ALTENTRY(.*)" ${APALM} | \
+ sed "s;\([^:]*\):\([^(]*\)(\([^, )]*\)\(.*\);\3 \1 /^\2(\3\4$$/;" \
+ >> ${TPALM}
+ sort -o ${TPALM} ${TPALM}
+
+links:
+ -for i in ${DPALM}; do \
+ (cd $$i && { rm -f tags; ln -s ${TPALM} tags; }) done
+
+obj: _SUBDIRUSE
+
+.include <bsd.prog.mk>
diff --git a/sys/arch/palm/compile/.cvsignore b/sys/arch/palm/compile/.cvsignore
new file mode 100644
index 00000000000..b72af3039e6
--- /dev/null
+++ b/sys/arch/palm/compile/.cvsignore
@@ -0,0 +1,2 @@
+GENERIC
+RAMDISK
diff --git a/sys/arch/palm/conf/GENERIC b/sys/arch/palm/conf/GENERIC
new file mode 100644
index 00000000000..390f5ff01f8
--- /dev/null
+++ b/sys/arch/palm/conf/GENERIC
@@ -0,0 +1,227 @@
+# $OpenBSD: GENERIC,v 1.1 2009/09/05 01:22:11 marex Exp $
+#
+# 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 palm arm
+include "../../../conf/GENERIC"
+maxusers 32 # estimated number of users
+
+options ARM32
+options PXAGPIO_HAS_GPION_INTRS
+
+options CACHE_CLEAN_BLOCK_INTR
+
+makeoptions KERNEL_BASE_PHYS="0xa0200000"
+makeoptions KERNEL_BASE_VIRT="0xc0200000"
+makeoptions BOARDTYPE="palm"
+
+# CPU options
+options CPU_XSCALE_PXA2X0 # Support the XScale core
+#options XSCALE_CACHE_WRITE_THROUGH
+options XSCALE_CACHE_WRITE_BACK
+makeoptions CPUFLAGS="-mcpu=xscale"
+
+option WSDISPLAY_COMPAT_USL # VT handling
+option WSDISPLAY_COMPAT_RAWKBD # provide raw scancodes; needed for X11
+option WSDISPLAY_DEFAULTSCREENS=2 # initial number of text consoles
+option WSDISPLAY_COMPAT_PCVT # emulate some ioctls; needed for X11
+
+option USBVERBOSE
+
+config bsd root on sd1a swap on sd1b
+#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 controller
+pxadmac0 at pxaip? # DMA controller
+pxaost0 at pxaip? addr 0x40a00000 size 0x20
+
+# USB controllers
+pxaudc0 at pxaip? # USB Device Controller
+ohci0 at pxaip? # Open Host Controller
+
+# USB function support
+usbf* at pxaudc? # USB logical device
+#cdcef* at usbf? # CDC ethernet function
+
+# USB bus support
+usb* at ohci?
+uhub* at usb? # USB Root Hub
+uhub* at uhub? # USB Hub
+
+# USB devices
+umodem* at uhub? # USB Modems/Serial
+ucom* at umodem?
+uvisor* at uhub? # Handspring Visor
+ucom* at uvisor?
+uvscom* at uhub? # SUNTAC Slipper U VS-10U serial
+ucom* at uvscom?
+ubsa* at uhub? # Belkin serial adapter
+ucom* at ubsa?
+uftdi* at uhub? # FTDI FT8U100AX serial adapter
+ucom* at uftdi?
+uplcom* at uhub? # I/O DATA USB-RSAQ2 serial adapter
+ucom* at uplcom?
+umct* at uhub? # MCT USB-RS232 serial adapter
+ucom* at umct?
+uslcom* at uhub? # Silicon Laboratories CP210x serial
+ucom* at uslcom?
+uark* at uhub? # Arkmicro ARK3116 serial
+ucom* at uark?
+uipaq* at uhub? # iPAQ serial adapter
+ucom* at uipaq?
+uchcom* at uhub? # WinChipHead CH341/340 serial
+ucom* at uchcom?
+uaudio* at uhub? # USB Audio
+audio* at uaudio?
+umidi* at uhub? # USB MIDI
+midi* at umidi?
+ulpt* at uhub? # USB Printers
+umass* at uhub? # USB Mass Storage devices
+scsibus* at umass?
+atapiscsi* at umass?
+uhidev* at uhub? # Human Interface Devices
+ums* at uhidev? # USB mouse
+wsmouse* at ums? mux 0
+ukbd* at uhidev? # USB keyboard
+wskbd* at ukbd? mux 1
+ucycom* at uhidev? # Cypress serial
+ucom* at ucycom?
+uhid* at uhidev? # USB generic HID support
+aue* at uhub? # ADMtek AN986 Pegasus Ethernet
+atu* at uhub? # Atmel AT76C50x based 802.11b
+axe* at uhub? # ASIX Electronics AX88172 USB Ethernet
+cue* at uhub? # CATC USB-EL1201A based Ethernet
+kue* at uhub? # Kawasaki KL5KUSB101B based Ethernet
+cdce* at uhub? # CDC Ethernet
+upl* at uhub? # Prolific PL2301/PL2302 host-to-host
+udav* at uhub? # Davicom DM9601 based Ethernet
+ural* at uhub? # Ralink RT2500USB
+rum* at uhub? # Ralink RT2501USB/RT2601USB
+run* at uhub? # Ralink RT2700U/RT2800U/RT3000U
+zyd* at uhub? # Zydas ZD1211
+url* at uhub? # Realtek RTL8150L based adapters
+wi* at uhub? # WaveLAN IEEE 802.11DS
+urio* at uhub? # Diamond Multimedia Rio 500
+uscanner* at uhub? # USB Scanners
+usscanner* at uhub? # USB SCSI scanners, e.g., HP5300
+scsibus* at usscanner?
+#uyap* at uhub? # Y@P firmware loader
+udsbr* at uhub? # D-Link DSB-R100 radio
+radio* at udsbr? # USB radio
+ugen* at uhub? # USB Generic driver
+udcf* at uhub? # Gude Expert mouseCLOCK
+umbg* at uhub? # Meinberg Funkuhren USB5131
+uow* at uhub? # Maxim/Dallas DS2490 1-Wire adapter
+onewire* at uow?
+
+sd* at scsibus? # SCSI disk drives
+#st* at scsibus? # SCSI tape drives
+cd* at scsibus? # SCSI CD-ROM drives
+#ch* at scsibus? # SCSI autochangers
+#ss* at scsibus? # SCSI scanners
+#uk* at scsibus? # unknown SCSI
+
+# integrated 16550 UARTs
+options COM_PXA2X0
+com0 at pxaip? addr 0x40100000 intr 22 # Full Function UART
+com1 at pxaip? addr 0x40200000 intr 21 # BlueTooth UART
+com2 at pxaip? addr 0x40700000 intr 20 # Standard UART (for IrDA)
+
+# integrated PCMCIA/CF controller
+#pxapcic0 at pxaip?
+
+# PCMCIA bus support
+#pcmcia* at pxapcic?
+
+# PCMCIA (CF) devices
+#com* at pcmcia? # PCMCIA modems/serial ports
+#wi* at pcmcia? # WaveLAN IEEE 802.11DS
+#malo* at pcmcia? # Marvell 88W8385
+#ne* at pcmcia? # PCMCIA based NE2000 ethernet
+#wdc* at pcmcia? # hard disk controller
+#cfxga* at pcmcia? # VoyagerVGA frame buffer
+#wsdisplay* at cfxga?
+
+wdc0 at pxaip?
+
+# IDE hard drives
+wd* at wdc? flags 0x0000
+
+# Media Independent Interface (mii) drivers
+exphy* at mii? # 3Com internal PHYs
+inphy* at mii? # Intel 82555 PHYs
+iophy* at mii? # Intel 82553 PHYs
+icsphy* at mii? # ICS 1890 PHYs
+lxtphy* at mii? # Level1 LXT970 PHYs
+nsphy* at mii? # NS and compatible PHYs
+nsphyter* at mii? # NS and compatible PHYs
+qsphy* at mii? # Quality Semi QS6612 PHYs
+sqphy* at mii? # Seeq 8x220 PHYs
+rlphy* at mii? # RealTek 8139 internal PHYs
+mtdphy* at mii? # Myson MTD972 PHYs
+#dcphy* at mii? # Digital Clone PHYs
+acphy* at mii? # Altima AC101 PHYs
+amphy* at mii? # AMD 79C873 PHYs
+tqphy* at mii? # TDK 78Q212x PHYs
+bmtphy* at mii? # Broadcom 10/100 PHYs
+#brgphy* at mii? # Broadcom Gigabit PHYs
+eephy* at mii? # Marvell 88E1000 series PHY
+#xmphy* at mii? # XaQti XMAC-II PHYs
+nsgphy* at mii? # NS gigabit PHYs
+urlphy* at mii? # Realtek RTL8150L internal PHY
+#rgephy* at mii? # Realtek 8169S/8110S PHY
+#ciphy* at mii? # Cicada CS8201 10/100/1000 copper PHY
+ukphy* at mii? # "unknown" PHYs
+
+# Input
+pxa27x_kpc0 at pxaip?
+wskbd0 at pxa27x_kpc0 mux 1
+
+lcd0 at pxaip? # LCD
+wsdisplay* at lcd? console ?
+
+pxammc0 at pxaip? # MMC/SD/SDIO controller
+sdmmc* at pxammc? # SD/MMC bus
+scsibus* at sdmmc? # SCSI emulation
+
+# Bluetooth controllers
+sbt* at sdmmc? # SDIO Bluetooth
+bthub* at sbt?
+ubt* at uhub? # USB Bluetooth
+bthub* at ubt?
+
+# USB Video
+uvideo* at uhub?
+video* at uvideo?
+
+bthidev* at bthub? # Bluetooth HID support
+btkbd* at bthidev?
+btms* at bthidev?
+wskbd* at btkbd? mux 1
+wsmouse* at btms? mux 0
+btsco* at bthub? # Bluetooth audio support
+audio* at btsco?
+
+# 1-Wire devices
+option ONEWIREVERBOSE
+owid* at onewire? # ID
+owsbm* at onewire? # Smart Battery Monitor
+owtemp* at onewire? # Temperature
+
+# Pseudo-Devices
+pseudo-device wsmux 2 # mouse & keyboard multiplexor
+pseudo-device hotplug 1 # devices hot plugging
diff --git a/sys/arch/palm/conf/Makefile.palm b/sys/arch/palm/conf/Makefile.palm
new file mode 100644
index 00000000000..3bfb4d590c6
--- /dev/null
+++ b/sys/arch/palm/conf/Makefile.palm
@@ -0,0 +1,213 @@
+# $OpenBSD: Makefile.palm,v 1.1 2009/09/05 01:22:11 marex 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/palm/conf/``machineid''
+# after which you should do
+# config machineid
+# Machine generic makefile changes should be made in
+# /sys/arch/palm/conf/Makefile.palm
+# 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/palm
+ARM= $S/arch/arm
+
+INCLUDES= -nostdinc -I. -I$S -I$S/arch
+CPPFLAGS= ${INCLUDES} ${IDENT} -D_KERNEL -D__palm__
+CDIAGFLAGS= -Werror -Wall -Wstrict-prototypes -Wmissing-prototypes \
+ -Wno-uninitialized -Wno-format -Wno-main \
+ -Wstack-larger-than-2047 -Wvariable-decl
+
+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}
+
+# 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_NOP= ${CC} ${CFLAGS} ${CPPFLAGS} -c $<
+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}
+SYSTEM_DEP= Makefile ${SYSTEM_OBJ}
+SYSTEM_LD_HEAD= rm -f $@
+SYSTEM_LD_HEAD+=; \
+ cat ${ARM}/conf/ldscript.head ${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 mv $@ $@.gdb; rm -f $@.gdb; mv $@ $@.gdb; \
+ echo ${STRIP} ${STRIPFLAGS} -o $@ $@.gdb; \
+ ${STRIP} ${STRIPFLAGS} -o $@ $@.gdb
+.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}
+
+mcount.o: $S/lib/libkern/mcount.c Makefile
+ ${NORMAL_C_NOP}
+
+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 \
+ 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}
+.if ${SFILES} != ""
+ ${MKDEP} -a ${AFLAGS} ${CPPFLAGS} ${SFILES}
+.endif
+ cat ${ARM}/arm/genassym.cf | \
+ sh $S/kern/genassym.sh ${MKDEP} -f assym.dep ${CFLAGS} \
+ ${CPPFLAGS}
+ @sed -e 's/.*\.o: /assym.h: /' -e 's/\/tmp\/genassym_c.[^ ]*//' \
+ < 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}/palm/${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/palm/conf/RAMDISK b/sys/arch/palm/conf/RAMDISK
new file mode 100644
index 00000000000..32e37a5a001
--- /dev/null
+++ b/sys/arch/palm/conf/RAMDISK
@@ -0,0 +1,171 @@
+# $OpenBSD: RAMDISK,v 1.1 2009/09/05 01:22:11 marex Exp $
+
+machine palm arm
+
+options TIMEZONE=0 # time zone to adjust RTC time by
+options DST=0 # daylight saving time used by RTC
+options FFS # UFS
+options CD9660 # ISO 9660 + Rock Ridge file system
+options MSDOSFS # MS-DOS file system
+options INET # IP + ICMP + TCP + UDP
+options INET6 # IPv6 (needs INET)
+options DDB # kernel debugger
+options EXT2FS # Second Extended Filesystem
+options CRYPTO # Cryptographic framework
+
+options ARM32
+options PXAGPIO_HAS_GPION_INTRS
+
+options CACHE_CLEAN_BLOCK_INTR
+
+makeoptions KERNEL_BASE_PHYS="0xa0200000"
+makeoptions KERNEL_BASE_VIRT="0xc0200000"
+makeoptions BOARDTYPE="palm"
+
+# estimated number of users
+
+maxusers 32
+
+# CPU options
+options CPU_XSCALE_PXA2X0 # Support the XScale core
+#options XSCALE_CACHE_WRITE_THROUGH
+options XSCALE_CACHE_WRITE_BACK
+makeoptions CPUFLAGS="-mcpu=xscale"
+
+option WSDISPLAY_COMPAT_USL # VT handling
+option WSDISPLAY_COMPAT_RAWKBD # provide raw scancodes; needed for X11
+option WSDISPLAY_DEFAULTSCREENS=2 # initial number of text consoles
+option WSDISPLAY_COMPAT_PCVT # emulate some ioctls; needed for X11
+
+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
+pxaost0 at pxaip? addr 0x40a00000 size 0x20
+
+# USB controllers
+pxaudc0 at pxaip? # USB Device Controller
+ohci0 at pxaip? # Open Host Controller
+
+# USB function support
+usbf* at pxaudc? # USB logical device
+#cdcef* at usbf? # CDC ethernet function
+
+# USB bus support
+usb* at ohci?
+uhub* at usb? # USB Root Hub
+uhub* at uhub? # USB Hubs
+
+# USB devices
+uhidev* at uhub?
+uhid* at uhidev? # USB Generic HID devices
+ukbd* at uhidev? # USB HID Keyboard devices
+wskbd* at ukbd? mux 1
+#ums* at uhub? # USB Mice
+#wsmouse* at ums? mux 0
+#ulpt* at uhub? # USB Printer
+#atu* at uhub? # Atmel AT76C50x based 802.11b
+#aue* at uhub? # ADMtek AN986 Pegasus Ethernet
+#axe* at uhub? # ASIX Electronics AX88172 USB Ethernet
+cdce* at uhub? # CDC Ethernet
+cue* at uhub? # CATC USB-EL1201A based Ethernet
+kue* at uhub? # Kawasaki KL5KUSB101B based Ethernet
+#udav* at uhub? # Davicom DM9601 based Ethernet
+ural* at uhub? # Ralink RT2500
+#url* at uhub? # Realtek RTL8150L based adapters
+wi* at uhub? # WaveLAN IEEE 802.11DS
+upl* at uhub? # Prolific PL2301/PL2302 host-to-host
+#uscanner* at uhub? # USB Scanner driver
+#usscanner* at uhub? # USB SCSI scanners
+#scsibus* at usscanner?
+#uyap* at uhub? # Y@P firmware loader
+#ugen* at uhub? # USB Generic driver
+umass* at uhub? # USB Mass Storage devices
+scsibus* at umass?
+
+# SD/MMC support
+pxammc0 at pxaip? # MMC/SD/SDIO controller
+sdmmc* at pxammc? # SD/MMC bus
+scsibus* at sdmmc? # SCSI emulation
+softraid0 at root # Software RAID
+scsibus* at softraid?
+
+sd* at scsibus?
+#st* at scsibus?
+cd* at scsibus?
+#ch* at scsibus?
+#ss* at scsibus?
+#uk* at scsibus?
+
+# integrated 16550 UARTs
+options COM_PXA2X0
+com0 at pxaip? addr 0x40100000 intr 22 # Full Function UART
+com1 at pxaip? addr 0x40200000 intr 21 # BlueTooth UART
+com2 at pxaip? addr 0x40700000 intr 20 # Standard UART (for IrDA)
+
+#aupxa0 at pxaip? # AC97 interface
+
+# CF (pcmcia) support
+#pxapcic0 at pxaip?
+#pcmcia* at pxapcic?
+#wi* at pcmcia?
+#ne* at pcmcia?
+#wdc* at pcmcia?
+
+wdc0 at pxaip?
+
+# IDE hard drives
+wd* at wdc? flags 0x0000
+
+# PHY
+#exphy* at mii? # 3Com internal PHYs
+#inphy* at mii? # Intel 82555 PHYs
+#iophy* at mii? # Intel 82553 PHYs
+#icsphy* at mii? # ICS 1890 PHYs
+#lxtphy* at mii? # Level1 LXT970 PHYs
+#nsphy* at mii? # NS and compatible PHYs
+#nsphyter* at mii? # NS and compatible PHYs
+#qsphy* at mii? # Quality Semi QS6612 PHYs
+#sqphy* at mii? # Seeq 8x220 PHYs
+#rlphy* at mii? # RealTek 8139 internal PHYs
+#mtdphy* at mii? # Myson MTD972 PHYs
+#dcphy* at mii? # Digital Clone PHYs
+#acphy* at mii? # Altima AC101 PHYs
+#amphy* at mii? # AMD 79C873 PHYs
+#tqphy* at mii? # TDK 78Q212x PHYs
+#bmtphy* at mii? # Broadcom 10/100 PHYs
+#brgphy* at mii? # Broadcom Gigabit PHYs
+#eephy* at mii? # Marvell 88E1000 series PHY
+#xmphy* at mii? # XaQti XMAC-II PHYs
+#nsgphy* at mii? # NS gigabit PHYs
+#urlphy* at mii? # Realtek RTL8150L internal PHY
+#rgephy* at mii? # Realtek 8169S/8110S PHY
+#ciphy* at mii? # Cicada CS8201 10/100/1000 copper PHY
+#ukphy* at mii? # "unknown" PHYs
+
+# Input
+pxa27x_kpc0 at pxaip?
+wskbd0 at pxa27x_kpc0 mux 1
+
+# LCD
+lcd0 at pxaip?
+wsdisplay* at lcd? console ?
+
+# 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
+pseudo-device bio 1 # ioctl multiplexing device
+
+options BOOT_CONFIG # boot-time kernel config
+
+# RAMDISK stuff
+options MINIROOTSIZE=5120
+options RAMDISK_HOOKS
diff --git a/sys/arch/palm/conf/files.palm b/sys/arch/palm/conf/files.palm
new file mode 100644
index 00000000000..a8346e15bb1
--- /dev/null
+++ b/sys/arch/palm/conf/files.palm
@@ -0,0 +1,92 @@
+# $OpenBSD: files.palm,v 1.1 2009/09/05 01:22:11 marex Exp $
+#
+# First try for arm-specific configuration info
+#
+
+maxpartitions 16
+maxusers 2 8 64
+
+major {wd = 16}
+major {sd = 24}
+major {cd = 26}
+major {rd = 18}
+
+file arch/arm/arm/conf.c
+
+file arch/palm/palm/palm_machdep.c
+
+#
+# Machine-independent SCSI drivers
+#
+include "../../../scsi/files.scsi"
+include "../../../dev/atapiscsi/files.atapiscsi"
+
+# CPU support and integrated peripherals
+include "arch/arm/xscale/files.pxa2x0"
+
+# LCD frame buffer
+attach lcd at pxaip with lcd_pxaip
+file arch/palm/palm/palm_lcd.c lcd_pxaip
+
+# SD/MMC socket controller
+attach pxammc at pxaip with pxammc_palm
+file arch/palm/dev/palm_mmc.c pxammc_palm
+
+#
+# Machine-independent ATA drivers
+#
+include "dev/ata/files.ata"
+
+# Drive
+#define palmvlio { [port = -1], [size = 0], [iomem = -1], [iosiz = 0], [irq = -1] }
+#device palmvlio: palmvlio
+#attach palmvlio at pxaip
+#file arch/palm/dev/palmvlio.c palmvlio
+
+#attach wdc at palmvlio with palmhdd
+attach wdc at pxaip with palm_hdd
+file arch/palm/dev/palm_hdd.c palm_hdd
+
+# Generic MD files
+file arch/palm/palm/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 WSCONS stuff
+include "dev/wscons/files.wscons"
+include "dev/rasops/files.rasops"
+include "dev/wsfont/files.wsfont"
+include "dev/pckbc/files.pckbc"
+
+# Include USB stuff
+include "dev/usb/files.usb"
+
+attach pxaudc at pxaip with pxaudc_palm
+file arch/palm/dev/palm_udc.c pxaudc_palm
+
+attach pxa27x_kpc at pxaip with pxakpc_palm
+file arch/palm/dev/palm_kpc.c pxakpc_palm
+
+# Bluetooth
+include "dev/bluetooth/files.bluetooth"
+
+# Media Independent Interface (mii)
+include "dev/mii/files.mii"
+
+#
+# Machine-independent SD/MMC drivers
+#
+include "dev/sdmmc/files.sdmmc"
+
+#
+# Machine-independent 1-Wire drivers
+#
+include "dev/onewire/files.onewire"
diff --git a/sys/arch/palm/dev/palm_hdd.c b/sys/arch/palm/dev/palm_hdd.c
new file mode 100644
index 00000000000..7ed37302362
--- /dev/null
+++ b/sys/arch/palm/dev/palm_hdd.c
@@ -0,0 +1,86 @@
+/*
+ * Marek Vasut '09
+ *
+ * Public domain
+ *
+ * */
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+
+#include <machine/bus.h>
+#include <machine/palm_var.h>
+
+#include <dev/ata/atavar.h>
+#include <dev/ic/wdcvar.h>
+
+#include <arch/arm/xscale/pxa2x0_gpio.h>
+#include <arch/arm/xscale/pxa2x0var.h>
+
+struct palm_hdd_softc {
+ struct wdc_softc sc_wdcdev;
+ struct channel_softc sc_channel;
+ void *sc_ih;
+};
+
+int palm_hdd_match(struct device *, void *, void *);
+void palm_hdd_attach(struct device *, struct device *, void *);
+
+struct cfattach palm_hdd_ca = {
+ sizeof(struct palm_hdd_softc),
+ palm_hdd_match,
+ palm_hdd_attach,
+};
+
+int palm_hdd_match(struct device *parent, void *match, void *aux)
+{
+ return mach_is_palmld;
+}
+
+void palm_hdd_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct palm_hdd_softc *sc = (void *)self;
+ struct channel_softc *chp = &sc->sc_channel;
+ struct pxaip_attach_args *pxa = aux;
+ int ret;
+
+ chp->cmd_iot = pxa->pxa_iot;
+ chp->ctl_iot = pxa->pxa_iot;
+
+ ret = bus_space_map(chp->cmd_iot, 0x20000010, WDC_NREG,
+ 0, &chp->cmd_ioh);
+ if (ret) {
+ printf(": Failed mapping CMD register\n");
+ return;
+ }
+
+ ret = bus_space_map(chp->ctl_iot, 0x2000000e, 2, 0, &chp->ctl_ioh);
+ if (ret) {
+ printf(": Failed mapping CTL register\n");
+ return;
+ }
+
+ sc->sc_ih = pxa2x0_gpio_intr_establish(95, IST_EDGE_BOTH, IPL_BIO, wdcintr, chp, self->dv_xname);
+
+ pxa2x0_gpio_set_bit(115); /* PWEN */
+ pxa2x0_gpio_clear_bit(98); /* RESET */
+ delay(50);
+ pxa2x0_gpio_set_bit(98); /* RESET */
+ delay(50);
+
+ sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DMA | WDC_CAPABILITY_SINGLE_DRIVE/* | WDC_CAPABILITY_IRQACK*/;
+ sc->sc_wdcdev.PIO_cap = 4;
+ sc->sc_wdcdev.channels = &chp;
+ sc->sc_wdcdev.nchannels = 1;
+
+ chp->channel = 0;
+ chp->wdc = &sc->sc_wdcdev;
+ chp->ch_queue = malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
+
+ printf("\n");
+
+ wdcattach(chp);
+ wdc_print_current_modes(chp);
+}
diff --git a/sys/arch/palm/dev/palm_kpc.c b/sys/arch/palm/dev/palm_kpc.c
new file mode 100644
index 00000000000..632cacab55b
--- /dev/null
+++ b/sys/arch/palm/dev/palm_kpc.c
@@ -0,0 +1,91 @@
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+
+#include <machine/machine_reg.h>
+#include <machine/palm_var.h>
+#include <arch/arm/xscale/pxa2x0_gpio.h>
+
+#include <arch/arm/xscale/pxa27x_kpc.h>
+
+int palm_kpc_match(struct device *, void *, void *);
+void palm_kpc_attach(struct device *, struct device *, void *);
+
+struct cfattach pxakpc_palm_ca = {
+ sizeof(struct pxa27x_kpc_softc),
+ palm_kpc_match,
+ palm_kpc_attach
+};
+
+const keysym_t palmkpc_keycodes[] = {
+ KS_KEYCODE(0), KS_s,
+ KS_KEYCODE(1), KS_a,
+ KS_KEYCODE(2), KS_b,
+ KS_KEYCODE(3), KS_c,
+ KS_KEYCODE(4), KS_d,
+ KS_KEYCODE(5), KS_Return,
+ KS_KEYCODE(6), KS_KP_Up,
+ KS_KEYCODE(7), KS_KP_Down,
+ KS_KEYCODE(8), KS_KP_Left,
+ KS_KEYCODE(9), KS_KP_Right,
+};
+
+#ifdef WSDISPLAY_COMPAT_RAWKBD
+const keysym_t palmkpc_xt_keycodes[] = {
+ RAWKEY_s,
+ RAWKEY_a,
+ RAWKEY_b,
+ RAWKEY_c,
+ RAWKEY_d,
+ RAWKEY_Return,
+ RAWKEY_KP_Up,
+ RAWKEY_KP_Down,
+ RAWKEY_KP_Left,
+ RAWKEY_KP_Right,
+};
+#endif
+
+const struct pxa27x_kpc_keymap palmkpc_keymap[] = {
+ {0, 0, 0},
+ {0, 1, 1},
+ {1, 0, 2},
+ {1, 1, 3},
+ {1, 2, 4},
+ {0, 2, 5},
+ {2, 0, 6},
+ {2, 2, 7},
+ {3, 2, 8},
+ {3, 0, 9},
+};
+
+int
+palm_kpc_match(struct device *parent, void *match, void *aux)
+{
+ return pxa27x_kpc_match();
+}
+
+void
+palm_kpc_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct pxa27x_kpc_softc *sc = (struct pxa27x_kpc_softc *)self;
+
+ pxa2x0_gpio_set_function(100, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(101, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(102, GPIO_ALT_FN_1_IN);
+ pxa2x0_gpio_set_function(97, GPIO_ALT_FN_3_IN);
+
+ pxa2x0_gpio_set_function(103, GPIO_ALT_FN_2_OUT);
+ pxa2x0_gpio_set_function(104, GPIO_ALT_FN_2_OUT);
+ pxa2x0_gpio_set_function(105, GPIO_ALT_FN_2_OUT);
+
+ sc->sc_rows = 4;
+ sc->sc_cols = 3;
+ sc->sc_kmap = palmkpc_keymap;
+ sc->sc_kcodes = palmkpc_keycodes;
+#ifdef WSDISPLAY_COMPAT_RAWKBD
+ sc->sc_xt_kcodes = palmkpc_xt_keycodes;
+#endif
+ sc->sc_ksize = sizeof(palmkpc_keycodes)/sizeof(keysym_t);
+
+ pxa27x_kpc_attach(sc, aux);
+}
diff --git a/sys/arch/palm/dev/palm_mmc.c b/sys/arch/palm/dev/palm_mmc.c
new file mode 100644
index 00000000000..e9a15d497bb
--- /dev/null
+++ b/sys/arch/palm/dev/palm_mmc.c
@@ -0,0 +1,90 @@
+/* $OpenBSD: palm_mmc.c,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+
+/*
+ * Copyright (c) 2009 Marek Vasut <marex@openbsd.org>
+ * Copyright (c) 2007 Uwe Stuehler <uwe@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* Attachment driver for pxammc(4) on Palm */
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+
+#include <dev/sdmmc/sdmmcreg.h>
+#include <machine/machine_reg.h>
+#include <machine/palm_var.h>
+#include <arch/arm/xscale/pxa2x0_gpio.h>
+
+#include <arch/arm/xscale/pxammcvar.h>
+
+int palm_mmc_match(struct device *, void *, void *);
+void palm_mmc_attach(struct device *, struct device *, void *);
+
+struct cfattach pxammc_palm_ca = {
+ sizeof(struct pxammc_softc),
+ palm_mmc_match,
+ palm_mmc_attach
+};
+
+u_int32_t palm_mmc_get_ocr(void *);
+int palm_mmc_set_power(void *, u_int32_t);
+
+int
+palm_mmc_match(struct device *parent, void *match, void *aux)
+{
+ return pxammc_match();
+}
+
+void
+palm_mmc_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct pxammc_softc *sc = (struct pxammc_softc *)self;
+
+ sc->tag.cookie = (void *)sc;
+ sc->tag.get_ocr = palm_mmc_get_ocr;
+ sc->tag.set_power = palm_mmc_set_power;
+
+ sc->sc_gpio_detect = GPIO14_MMC_DETECT;
+
+ pxammc_attach(sc, aux);
+}
+
+u_int32_t
+palm_mmc_get_ocr(void *cookie)
+{
+ return MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V;
+}
+
+int
+palm_mmc_set_power(void *cookie, u_int32_t ocr)
+{
+ if (ISSET(ocr, MMC_OCR_3_2V_3_3V | MMC_OCR_3_3V_3_4V)) {
+ if (mach_is_palmz72)
+ pxa2x0_gpio_clear_bit(GPIO98_PALMZ72_MMC_POWER);
+ else
+ pxa2x0_gpio_set_bit(GPIO114_MMC_POWER);
+ return 0;
+ } else if (ocr != 0) {
+ printf("palm_mmc_set_power: unsupported OCR (%#x)\n", ocr);
+ return EINVAL;
+ } else {
+ if (mach_is_palmz72)
+ pxa2x0_gpio_set_bit(GPIO98_PALMZ72_MMC_POWER);
+ else
+ pxa2x0_gpio_clear_bit(GPIO114_MMC_POWER);
+ return 0;
+ }
+}
diff --git a/sys/arch/palm/dev/palm_udc.c b/sys/arch/palm/dev/palm_udc.c
new file mode 100644
index 00000000000..fd59dba9aee
--- /dev/null
+++ b/sys/arch/palm/dev/palm_udc.c
@@ -0,0 +1,91 @@
+/* $OpenBSD: palm_udc.c,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+
+/*
+ * Copyright (c) 2009 Marek Vasut <marex@openbsd.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/systm.h>
+#include <sys/timeout.h>
+
+#include <dev/sdmmc/sdmmcreg.h>
+#include <machine/machine_reg.h>
+#include <machine/palm_var.h>
+
+#include <dev/usb/usb.h>
+#include <dev/usb/usbdi.h>
+#include <dev/usb/usbdivar.h>
+#include <dev/usb/usbf.h>
+#include <dev/usb/usbfvar.h>
+
+#include <arch/arm/xscale/pxa2x0_gpio.h>
+#include <arch/arm/xscale/pxa27x_udc.h>
+
+int palm_udc_match(struct device *, void *, void *);
+void palm_udc_attach(struct device *, struct device *, void *);
+int palm_udc_detach(struct device *, int);
+int palm_udc_is_host(void);
+
+struct cfattach pxaudc_palm_ca = {
+ sizeof(struct pxaudc_softc),
+ palm_udc_match,
+ palm_udc_attach,
+ palm_udc_detach,
+};
+
+int
+palm_udc_match(struct device *parent, void *match, void *aux)
+{
+ if (mach_is_palmld)
+ return 0;
+ return pxaudc_match();
+}
+
+int
+palm_udc_is_host(void)
+{
+ return 1;
+}
+
+void
+palm_udc_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct pxaudc_softc *sc = (struct pxaudc_softc *)self;
+
+ if (mach_is_palmtx)
+ sc->sc_gpio_detect = GPIO13_PALMTX_USB_DETECT;
+ else if (mach_is_palmt5 || mach_is_palmz72)
+ sc->sc_gpio_detect = GPIO15_USB_DETECT;
+ else {
+ printf(": No suitable GPIO setup found\n");
+ return;
+ }
+
+ sc->sc_gpio_detect_inv = 1;
+ sc->sc_gpio_pullup = GPIO95_USB_PULLUP;
+ sc->sc_gpio_pullup_inv = 0;
+ sc->sc_is_host = palm_udc_is_host;
+
+ pxaudc_attach(sc, aux);
+}
+
+int
+palm_udc_detach(struct device *self, int flags)
+{
+ struct pxaudc_softc *sc = (struct pxaudc_softc *)self;
+
+ return pxaudc_detach(sc, flags);
+}
diff --git a/sys/arch/palm/include/_types.h b/sys/arch/palm/include/_types.h
new file mode 100644
index 00000000000..ceb1299ed1e
--- /dev/null
+++ b/sys/arch/palm/include/_types.h
@@ -0,0 +1,11 @@
+/* $OpenBSD: _types.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+
+#ifndef _PALM__TYPES_H_
+#define _PALM__TYPES_H_
+
+#include <arm/_types.h>
+
+#define __HAVE_GENERIC_SOFT_INTERRUPTS
+#define __HAVE_TIMECOUNTER
+
+#endif
diff --git a/sys/arch/palm/include/apmvar.h b/sys/arch/palm/include/apmvar.h
new file mode 100644
index 00000000000..dfce83ed6c6
--- /dev/null
+++ b/sys/arch/palm/include/apmvar.h
@@ -0,0 +1 @@
+#include <arm/apmvar.h>
diff --git a/sys/arch/palm/include/asm.h b/sys/arch/palm/include/asm.h
new file mode 100644
index 00000000000..392dab502e4
--- /dev/null
+++ b/sys/arch/palm/include/asm.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: asm.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: asm.h,v 1.3 2001/11/25 15:55:54 thorpej Exp $ */
+
+#include <arm/asm.h>
diff --git a/sys/arch/palm/include/atomic.h b/sys/arch/palm/include/atomic.h
new file mode 100644
index 00000000000..7dc6d3f12ae
--- /dev/null
+++ b/sys/arch/palm/include/atomic.h
@@ -0,0 +1,10 @@
+/* $OpenBSD: atomic.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+
+/* Public Domain */
+
+#ifndef __PALM_ATOMIC_H__
+#define __PALM_ATOMIC_H__
+
+#include <arm/atomic.h>
+
+#endif /* __PALM_ATOMIC_H__ */
diff --git a/sys/arch/palm/include/bootconfig.h b/sys/arch/palm/include/bootconfig.h
new file mode 100644
index 00000000000..1250503f3d2
--- /dev/null
+++ b/sys/arch/palm/include/bootconfig.h
@@ -0,0 +1,76 @@
+/* $OpenBSD: bootconfig.h,v 1.1 2009/09/05 01:22:11 marex 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/palm/include/bus.h b/sys/arch/palm/include/bus.h
new file mode 100644
index 00000000000..f2fbe6adc95
--- /dev/null
+++ b/sys/arch/palm/include/bus.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: bus.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: bus.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/bus.h>
diff --git a/sys/arch/palm/include/cdefs.h b/sys/arch/palm/include/cdefs.h
new file mode 100644
index 00000000000..a18a7891219
--- /dev/null
+++ b/sys/arch/palm/include/cdefs.h
@@ -0,0 +1,3 @@
+/* $OpenBSD: cdefs.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+
+#include <arm/cdefs.h>
diff --git a/sys/arch/palm/include/conf.h b/sys/arch/palm/include/conf.h
new file mode 100644
index 00000000000..594c93f749b
--- /dev/null
+++ b/sys/arch/palm/include/conf.h
@@ -0,0 +1,18 @@
+/* $OpenBSD: conf.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: conf.h,v 1.8 2002/02/10 12:26:03 chris Exp $ */
+
+#ifndef _PALM_CONF_H
+#define _PALM_CONF_H
+
+#include <sys/conf.h>
+
+/*
+ * PALM specific device includes go in here
+ */
+
+#define CONF_HAVE_USB
+#define CONF_HAVE_WSCONS
+
+#include <arm/conf.h>
+
+#endif /* _PALM_CONF_H */
diff --git a/sys/arch/palm/include/cpu.h b/sys/arch/palm/include/cpu.h
new file mode 100644
index 00000000000..ac0c146970b
--- /dev/null
+++ b/sys/arch/palm/include/cpu.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: cpu.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: cpu.h,v 1.3 2001/11/25 15:55:55 thorpej Exp $ */
+
+#include <arm/cpu.h>
diff --git a/sys/arch/palm/include/db_machdep.h b/sys/arch/palm/include/db_machdep.h
new file mode 100644
index 00000000000..ce5d9a3b83e
--- /dev/null
+++ b/sys/arch/palm/include/db_machdep.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: db_machdep.h,v 1.1 2009/09/05 01:22:11 marex 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/palm/include/disklabel.h b/sys/arch/palm/include/disklabel.h
new file mode 100644
index 00000000000..bd28d88b786
--- /dev/null
+++ b/sys/arch/palm/include/disklabel.h
@@ -0,0 +1,3 @@
+/* $OpenBSD: disklabel.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+
+#include <arm/disklabel.h>
diff --git a/sys/arch/palm/include/endian.h b/sys/arch/palm/include/endian.h
new file mode 100644
index 00000000000..e2d87fd071f
--- /dev/null
+++ b/sys/arch/palm/include/endian.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: endian.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: endian.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/endian.h>
diff --git a/sys/arch/palm/include/exec.h b/sys/arch/palm/include/exec.h
new file mode 100644
index 00000000000..7ec228c960e
--- /dev/null
+++ b/sys/arch/palm/include/exec.h
@@ -0,0 +1,3 @@
+/* $OpenBSD: exec.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* public domain */
+#include <arm/exec.h>
diff --git a/sys/arch/palm/include/float.h b/sys/arch/palm/include/float.h
new file mode 100644
index 00000000000..12cc5598874
--- /dev/null
+++ b/sys/arch/palm/include/float.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: float.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: float.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/float.h>
diff --git a/sys/arch/palm/include/fp.h b/sys/arch/palm/include/fp.h
new file mode 100644
index 00000000000..a9f0a55c63c
--- /dev/null
+++ b/sys/arch/palm/include/fp.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: fp.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: fp.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/fp.h>
diff --git a/sys/arch/palm/include/frame.h b/sys/arch/palm/include/frame.h
new file mode 100644
index 00000000000..c3b3d8a993c
--- /dev/null
+++ b/sys/arch/palm/include/frame.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: frame.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: frame.h,v 1.1 2001/06/08 22:23:00 chris Exp $ */
+
+#include <arm/frame.h>
diff --git a/sys/arch/palm/include/ieee.h b/sys/arch/palm/include/ieee.h
new file mode 100644
index 00000000000..4cac2e063f8
--- /dev/null
+++ b/sys/arch/palm/include/ieee.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ieee.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: ieee.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/ieee.h>
diff --git a/sys/arch/palm/include/ieeefp.h b/sys/arch/palm/include/ieeefp.h
new file mode 100644
index 00000000000..32d3e7cb922
--- /dev/null
+++ b/sys/arch/palm/include/ieeefp.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ieeefp.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: ieeefp.h,v 1.3 2001/11/25 15:55:56 thorpej Exp $ */
+
+#include <arm/ieeefp.h>
diff --git a/sys/arch/palm/include/internal_types.h b/sys/arch/palm/include/internal_types.h
new file mode 100644
index 00000000000..0d4c8a996ab
--- /dev/null
+++ b/sys/arch/palm/include/internal_types.h
@@ -0,0 +1,7 @@
+/* $OpenBSD: internal_types.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* Public domain */
+#ifndef _MACHINE_INTERNAL_TYPES_H_
+#define _MACHINE_INTERNAL_TYPES_H_
+
+#include "arm/internal_types.h"
+#endif
diff --git a/sys/arch/palm/include/intr.h b/sys/arch/palm/include/intr.h
new file mode 100644
index 00000000000..c341f9ea7f0
--- /dev/null
+++ b/sys/arch/palm/include/intr.h
@@ -0,0 +1,104 @@
+/* $OpenBSD: intr.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $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_SOFTTTY 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 NIPL 13
+
+/* 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
+
+#ifndef _LOCORE
+
+#include <sys/device.h>
+#include <sys/queue.h>
+
+#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 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 splsched() splhigh()
+#define spllock() splhigh()
+
+#endif /* ! _LOCORE */
+
+#include <arm/xscale/pxa2x0_intr.h>
+
+#endif /* _KERNEL */
+
+#endif /* _EVBARM_INTR_H_ */
+
diff --git a/sys/arch/palm/include/limits.h b/sys/arch/palm/include/limits.h
new file mode 100644
index 00000000000..3598c6138a4
--- /dev/null
+++ b/sys/arch/palm/include/limits.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: limits.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: limits.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/limits.h>
diff --git a/sys/arch/palm/include/loadfile_machdep.h b/sys/arch/palm/include/loadfile_machdep.h
new file mode 100644
index 00000000000..f004e7f7e19
--- /dev/null
+++ b/sys/arch/palm/include/loadfile_machdep.h
@@ -0,0 +1,52 @@
+/* $OpenBSD: loadfile_machdep.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: loadfile_machdep.h,v 1.1 1999/04/29 03:17:12 tsubai Exp $ */
+
+/*-
+ * Copyright (c) 1999 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
+ */
+
+#define BOOT_ELF
+#define ELFSIZE 32
+
+#define LOAD_KERNEL (LOAD_ALL & ~LOAD_TEXTA)
+#define COUNT_KERNEL (COUNT_ALL & ~COUNT_TEXTA)
+
+#define LOADADDR(a) ((((u_long)(a)) + offset)&0xfffffff)
+#define ALIGNENTRY(a) ((u_long)(a))
+#define READ(f, b, c) read((f), (void *)LOADADDR(b), (c))
+#define BCOPY(s, d, c) memcpy((void *)LOADADDR(d), (void *)(s), (c))
+#define BZERO(d, c) memset((void *)LOADADDR(d), 0, (c))
+#define WARN(a) (void)(printf a, \
+ printf((errno ? ": %s\n" : "\n"), \
+ strerror(errno)))
+#define PROGRESS(a) (void) printf a
+#define ALLOC(a) alloc(a)
+#define FREE(a, b) free(a, b)
+#define OKMAGIC(a) ((a) == OMAGIC)
+
+void run_loadfile(u_long *, int);
diff --git a/sys/arch/palm/include/lock.h b/sys/arch/palm/include/lock.h
new file mode 100644
index 00000000000..957453843f6
--- /dev/null
+++ b/sys/arch/palm/include/lock.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: lock.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: lock.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/lock.h>
diff --git a/sys/arch/palm/include/machine_reg.h b/sys/arch/palm/include/machine_reg.h
new file mode 100644
index 00000000000..d11d866ef9a
--- /dev/null
+++ b/sys/arch/palm/include/machine_reg.h
@@ -0,0 +1,67 @@
+/* $OpenBSD: machine_reg.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $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 _PALM_REG_H
+#define _PALM_REG_H
+
+#include <arm/xscale/pxa2x0reg.h>
+
+/*
+ * Logical mapping for onboard/integrated peripherals
+ */
+#define PALM_IO_AREA_VBASE 0xfd000000
+#define PALM_GPIO_VBASE 0xfd000000
+#define PALM_CLKMAN_VBASE 0xfd100000
+#define PALM_INTCTL_VBASE 0xfd200000
+#define PALM_VBASE_FREE 0xfd300000
+/* FFUART, BTUART and/or STUART are mapped to this area when
+ used for console or kgdb port */
+
+#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))
+
+/* GPIOs */
+#define GPIO14_MMC_DETECT 14 /* MMC detect*/
+#define GPIO114_MMC_POWER 114 /* MMC power */
+#define GPIO98_PALMZ72_MMC_POWER 98 /* Z72 MMC power */
+
+#define GPIO13_PALMTX_USB_DETECT 13
+#define GPIO15_USB_DETECT 15
+#define GPIO95_USB_PULLUP 95
+
+#endif /* _PALM_REG_H */
diff --git a/sys/arch/palm/include/mutex.h b/sys/arch/palm/include/mutex.h
new file mode 100644
index 00000000000..7f5c6298504
--- /dev/null
+++ b/sys/arch/palm/include/mutex.h
@@ -0,0 +1,3 @@
+/* $OpenBSD: mutex.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* public domain */
+#include <arm/mutex.h>
diff --git a/sys/arch/palm/include/palm_var.h b/sys/arch/palm/include/palm_var.h
new file mode 100644
index 00000000000..8ead3c7941d
--- /dev/null
+++ b/sys/arch/palm/include/palm_var.h
@@ -0,0 +1,68 @@
+/* $OpenBSD: palm_var.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $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_PALM_VAR_H
+#define _EVBARM_PALM_VAR_H
+
+#ifndef __ASSEMBLER__
+#include <sys/conf.h>
+#include <sys/device.h>
+
+#include <machine/bus.h>
+#include <machine/machine_reg.h>
+
+extern int mach;
+
+#define mach_is_palmt5 ( mach == 917 ? 1 : 0 )
+#define mach_is_palmtx ( mach == 885 ? 1 : 0 )
+#define mach_is_palmld ( mach == 835 ? 1 : 0 )
+#define mach_is_palmz72 ( mach == 904 ? 1 : 0 )
+
+static inline char *mach_name(void)
+{
+ if (mach_is_palmt5) return "Palm Tungsten|T5";
+ else if (mach_is_palmtx) return "Palm T|X";
+ else if (mach_is_palmld) return "Palm LifeDrive";
+ else if (mach_is_palmz72) return "Palm Zire72";
+ else return "Unknown";
+}
+#endif
+
+#ifdef _KERNEL
+
+#define SDRAM_START 0xa0000000
+#define SDRAM_SIZE_MB 32
+#define SDRAM_SIZE (SDRAM_SIZE_MB * 1024 * 1024)
+
+#endif
+
+#endif /* _EVBARM_PALM_VAR_H */
diff --git a/sys/arch/palm/include/param.h b/sys/arch/palm/include/param.h
new file mode 100644
index 00000000000..eda43c5ff2d
--- /dev/null
+++ b/sys/arch/palm/include/param.h
@@ -0,0 +1,51 @@
+/* $OpenBSD: param.h,v 1.1 2009/09/05 01:22:11 marex 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 _PALM_PARAM_H_
+#define _PALM_PARAM_H_
+
+/*
+ * 1 page should be enough
+ */
+#ifndef MSGBUFSIZE
+#define MSGBUFSIZE (1*NBPG)
+#endif
+
+#include <arm/param.h>
+
+#define _MACHINE palm
+#define MACHINE "palm"
+
+#endif /* _PALM_PARAM_H_ */
diff --git a/sys/arch/palm/include/pcb.h b/sys/arch/palm/include/pcb.h
new file mode 100644
index 00000000000..a89cb24f22d
--- /dev/null
+++ b/sys/arch/palm/include/pcb.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: pcb.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: pcb.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/pcb.h>
diff --git a/sys/arch/palm/include/pio.h b/sys/arch/palm/include/pio.h
new file mode 100644
index 00000000000..2d59f4cd30d
--- /dev/null
+++ b/sys/arch/palm/include/pio.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: pio.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: pio.h,v 1.3 2001/12/07 23:09:33 chris Exp $ */
+
+#include <arm/pio.h>
diff --git a/sys/arch/palm/include/pmap.h b/sys/arch/palm/include/pmap.h
new file mode 100644
index 00000000000..6027d8956a5
--- /dev/null
+++ b/sys/arch/palm/include/pmap.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: pmap.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: pmap.h,v 1.2 2001/11/23 17:29:01 thorpej Exp $ */
+
+#include <arm/pmap.h>
diff --git a/sys/arch/palm/include/proc.h b/sys/arch/palm/include/proc.h
new file mode 100644
index 00000000000..e8b9cc8bec6
--- /dev/null
+++ b/sys/arch/palm/include/proc.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: proc.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: proc.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/proc.h>
diff --git a/sys/arch/palm/include/profile.h b/sys/arch/palm/include/profile.h
new file mode 100644
index 00000000000..11868d85e6e
--- /dev/null
+++ b/sys/arch/palm/include/profile.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: profile.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: profile.h,v 1.3 2001/11/25 15:55:57 thorpej Exp $ */
+
+#include <arm/profile.h>
diff --git a/sys/arch/palm/include/psl.h b/sys/arch/palm/include/psl.h
new file mode 100644
index 00000000000..d5dbd282e80
--- /dev/null
+++ b/sys/arch/palm/include/psl.h
@@ -0,0 +1 @@
+/* $OpenBSD: psl.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
diff --git a/sys/arch/palm/include/ptrace.h b/sys/arch/palm/include/ptrace.h
new file mode 100644
index 00000000000..93ad5291e1c
--- /dev/null
+++ b/sys/arch/palm/include/ptrace.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: ptrace.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: ptrace.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/ptrace.h>
diff --git a/sys/arch/palm/include/reg.h b/sys/arch/palm/include/reg.h
new file mode 100644
index 00000000000..edaaec59709
--- /dev/null
+++ b/sys/arch/palm/include/reg.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: reg.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: reg.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/reg.h>
diff --git a/sys/arch/palm/include/reloc.h b/sys/arch/palm/include/reloc.h
new file mode 100644
index 00000000000..1c710d0f403
--- /dev/null
+++ b/sys/arch/palm/include/reloc.h
@@ -0,0 +1,2 @@
+/* $OpenBSD: reloc.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+#include <arm/reloc.h>
diff --git a/sys/arch/palm/include/setjmp.h b/sys/arch/palm/include/setjmp.h
new file mode 100644
index 00000000000..0f912a5e5f4
--- /dev/null
+++ b/sys/arch/palm/include/setjmp.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: setjmp.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: setjmp.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/setjmp.h>
diff --git a/sys/arch/palm/include/signal.h b/sys/arch/palm/include/signal.h
new file mode 100644
index 00000000000..18c82d9046f
--- /dev/null
+++ b/sys/arch/palm/include/signal.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: signal.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: signal.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/signal.h>
diff --git a/sys/arch/palm/include/spinlock.h b/sys/arch/palm/include/spinlock.h
new file mode 100644
index 00000000000..08f6357886f
--- /dev/null
+++ b/sys/arch/palm/include/spinlock.h
@@ -0,0 +1,7 @@
+
+/* $OpenBSD: spinlock.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+#ifndef _PALM_SPINLOCK_H_
+#define _PALM_SPINLOCK_H_
+#include <arm/spinlock.h>
+#endif /* _PALM_SPINLOCK_H_ */
+
diff --git a/sys/arch/palm/include/stdarg.h b/sys/arch/palm/include/stdarg.h
new file mode 100644
index 00000000000..fffd42d20a4
--- /dev/null
+++ b/sys/arch/palm/include/stdarg.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: stdarg.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: stdarg.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/stdarg.h>
diff --git a/sys/arch/palm/include/sysarch.h b/sys/arch/palm/include/sysarch.h
new file mode 100644
index 00000000000..1c96638477c
--- /dev/null
+++ b/sys/arch/palm/include/sysarch.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: sysarch.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: sysarch.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/sysarch.h>
diff --git a/sys/arch/palm/include/trap.h b/sys/arch/palm/include/trap.h
new file mode 100644
index 00000000000..9d95c6bb464
--- /dev/null
+++ b/sys/arch/palm/include/trap.h
@@ -0,0 +1,4 @@
+/* $OpenBSD: trap.h,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $NetBSD: trap.h,v 1.3 2001/11/25 15:55:58 thorpej Exp $ */
+
+#include <arm/trap.h>
diff --git a/sys/arch/palm/include/vmparam.h b/sys/arch/palm/include/vmparam.h
new file mode 100644
index 00000000000..159228a4679
--- /dev/null
+++ b/sys/arch/palm/include/vmparam.h
@@ -0,0 +1,86 @@
+/* $OpenBSD: vmparam.h,v 1.1 2009/09/05 01:22:11 marex 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 1
+#define VM_PHYSSEG_STRAT VM_PSTRAT_RANDOM
+
+/*
+ * this indicates that we can't add RAM to the VM system after the
+ * vm system is init'd.
+ */
+
+#define VM_PHYSSEG_NOADD
+
+#endif /* _KERNEL */
+
+#define VM_NFREELIST 1
+#define VM_FREELIST_DEFAULT 0
+
+
+#endif /* _ARM32_VMPARAM_H_ */
diff --git a/sys/arch/palm/palm/autoconf.c b/sys/arch/palm/palm/autoconf.c
new file mode 100644
index 00000000000..1bf98a76479
--- /dev/null
+++ b/sys/arch/palm/palm/autoconf.c
@@ -0,0 +1,147 @@
+/* $OpenBSD: autoconf.c,v 1.1 2009/09/05 01:22:11 marex 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/timeout.h>
+#include <sys/malloc.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <machine/bootconfig.h>
+#include <machine/intr.h>
+#include <dev/cons.h>
+
+int booted_partition;
+struct device *bootdv = NULL;
+extern char *boot_file;
+
+void dumpconf(void);
+
+/*
+ * 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()
+{
+ dev_t tmpdev;
+
+#if 0
+ /*
+ * 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.
+ */
+ dkcsumattach();
+#endif
+
+ /*
+ * XXX
+ * palm bootblocks currently pass in "bsd" instead of
+ * "device:bsd", or any such thing, making this a real pain.
+ */
+ if (bootdv == NULL)
+ bootdv = parsedisk("sd0a", strlen("sd0a"), 0, &tmpdev);
+ if (bootdv == NULL)
+ printf("boot device: lookup '%s' failed.\n", boot_file);
+ else
+ printf("boot device: %s\n", bootdv->dv_xname);
+
+ setroot(bootdv, 0, RB_USERREQ);
+ dumpconf();
+}
+
+void
+device_register(struct device *dev, void *aux)
+{
+}
+
+/*
+ * 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.
+ */
+ cold = 0;
+
+ /* Time to start taking interrupts so lets open the flood gates .... */
+ (void)spl0();
+
+}
+
+struct nam2blk nam2blk[] = {
+ { "wd", 16 },
+ { "sd", 24 },
+ { "cd", 26 },
+ { "rd", 18 },
+ { "raid", 71 },
+ { "vnd", 19 },
+ { NULL, -1 }
+};
diff --git a/sys/arch/palm/palm/palm_lcd.c b/sys/arch/palm/palm/palm_lcd.c
new file mode 100644
index 00000000000..f1b55b4f15d
--- /dev/null
+++ b/sys/arch/palm/palm/palm_lcd.c
@@ -0,0 +1,249 @@
+/* $OpenBSD: palm_lcd.c,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $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 Palm (based on the Intel Lubbock driver).
+ *
+ * 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 and backlight brightness
+ * LCD panel geometry
+ */
+
+#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 <machine/palm_var.h>
+#include <arm/xscale/pxa2x0var.h>
+#include <arm/xscale/pxa2x0reg.h>
+#include <arm/xscale/pxa2x0_lcd.h>
+
+#include <dev/rasops/rasops.h>
+
+void lcd_attach(struct device *, struct device *, void *);
+int lcd_match(struct device *, void *, void *);
+int lcd_cnattach(void (*)(u_int, int));
+
+/*
+ * wsdisplay glue
+ */
+struct pxa2x0_wsscreen_descr
+lcd_bpp16_screen = {
+ {
+ "std"
+ },
+ 16, /* bits per pixel */
+ 0, /* no rotation */
+};
+
+static const struct wsscreen_descr *lcd_scr_descr[] = {
+ &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 *);
+void lcd_burner(void *, u_int, u_int);
+int lcd_show_screen(void *, void *, int,
+ void (*)(void *, int, int), void *);
+const struct lcd_panel_geometry *lcd_geom_get(void);
+
+int lcd_param(struct pxa2x0_lcd_softc *, u_long,
+ struct wsdisplay_param *);
+
+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 */
+ NULL, /* scrollback */
+ NULL, /* getchar */
+ NULL
+};
+
+struct cfattach lcd_pxaip_ca = {
+ sizeof (struct pxa2x0_lcd_softc), lcd_match, lcd_attach
+};
+
+struct cfdriver lcd_cd = {
+ NULL, "lcd", DV_DULL
+};
+
+const struct lcd_panel_geometry palm_t5_lcd =
+{
+ 324, /* Width */
+ 484, /* Height */
+ 0, /* No extra lines */
+
+ LCDPANEL_ACTIVE | LCDPANEL_VSP | LCDPANEL_HSP,
+ 2, /* clock divider */
+ 0, /* AC bias pin freq */
+
+ 0x03, /* horizontal sync pulse width */
+ 0x1e, /* BLW */
+ 0x03, /* ELW */
+
+ 0x00, /* vertical sync pulse width */
+ 0x05, /* BFW */
+ 0x08, /* EFW */
+};
+
+const struct lcd_panel_geometry palm_z72_lcd =
+{
+ 324, /* Width */
+ 324, /* Height */
+ 0, /* No extra lines */
+
+ LCDPANEL_ACTIVE | LCDPANEL_VSP | LCDPANEL_HSP,
+ 2, /* clock divider */
+ 0, /* AC bias pin freq */
+
+ 0x03, /* horizontal sync pulse width */
+ 0x1a, /* BLW */
+ 0x03, /* ELW */
+
+ 0x00, /* vertical sync pulse width */
+ 0x05, /* BFW */
+ 0x08, /* EFW */
+};
+
+int
+lcd_match(struct device *parent, void *cf, void *aux)
+{
+ return 1;
+}
+
+const struct lcd_panel_geometry *lcd_geom_get(void)
+{
+ if (mach_is_palmz72)
+ return &palm_z72_lcd;
+ else
+ return &palm_t5_lcd;
+}
+
+void
+lcd_attach(struct device *parent, struct device *self, void *aux)
+{
+ struct pxa2x0_lcd_softc *sc = (struct pxa2x0_lcd_softc *)self;
+ struct wsemuldisplaydev_attach_args aa;
+ extern int glass_console;
+
+ printf("\n");
+
+ pxa2x0_lcd_attach_sub(sc, aux, &lcd_bpp16_screen, lcd_geom_get(),
+ glass_console);
+
+ aa.console = glass_console;
+ aa.scrdata = &lcd_screen_list;
+ aa.accessops = &lcd_accessops;
+ aa.accesscookie = sc;
+ aa.defaultscreens = 0;
+
+ (void)config_found(self, &aa, wsemuldisplaydevprint);
+}
+
+int
+lcd_cnattach(void (*clkman)(u_int, int))
+{
+ return
+ (pxa2x0_lcd_cnattach(&lcd_bpp16_screen, lcd_geom_get(), clkman));
+}
+
+/*
+ * wsdisplay accessops overrides
+ */
+
+int
+lcd_ioctl(void *v, u_long cmd, caddr_t data, int flag, struct proc *p)
+{
+ struct pxa2x0_lcd_softc *sc = v;
+ int res = EINVAL;
+
+ switch (cmd) {
+ case WSDISPLAYIO_GETPARAM:
+ case WSDISPLAYIO_SETPARAM:
+ res = lcd_param(sc, cmd, (struct wsdisplay_param *)data);
+ break;
+ }
+
+ if (res == EINVAL)
+ res = pxa2x0_lcd_ioctl(v, cmd, data, flag, p);
+
+ return res;
+}
+
+int
+lcd_show_screen(void *v, void *cookie, int waitok,
+ void (*cb)(void *, int, int), void *cbarg)
+{
+ int rc;
+
+ if ((rc = pxa2x0_lcd_show_screen(v, cookie, waitok, cb, cbarg)) != 0)
+ return (rc);
+
+ return (0);
+}
+
+/*
+ * wsdisplay I/O controls
+ */
+
+int
+lcd_param(struct pxa2x0_lcd_softc *sc, u_long cmd,
+ struct wsdisplay_param *dp)
+{
+ int res = EINVAL;
+
+ switch (dp->param) {
+ case WSDISPLAYIO_PARAM_CONTRAST:
+ /* unsupported */
+ res = ENOTTY;
+ break;
+ }
+
+ return res;
+}
diff --git a/sys/arch/palm/palm/palm_machdep.c b/sys/arch/palm/palm/palm_machdep.c
new file mode 100644
index 00000000000..c99d678667c
--- /dev/null
+++ b/sys/arch/palm/palm/palm_machdep.c
@@ -0,0 +1,1252 @@
+/* $OpenBSD: palm_machdep.c,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $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/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 <sys/kcore.h>
+
+#include <uvm/uvm_extern.h>
+
+#include <sys/conf.h>
+#include <sys/queue.h>
+#include <sys/device.h>
+#include <dev/cons.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/kcore.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/machine_reg.h>
+#include <machine/palm_var.h>
+
+#include "wsdisplay.h"
+
+int mach = -1; /* machine ID */
+
+/* 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 + SDRAM_SIZE)
+
+/*
+ * 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;
+
+paddr_t physical_start;
+paddr_t physical_freestart;
+paddr_t physical_freeend;
+paddr_t physical_end;
+u_int free_pages;
+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;
+
+paddr_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 32MB 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 */
+
+#define BOOT_STRING_MAGIC 0x4f425344
+
+char bootargs[MAX_BOOT_STRING];
+inline void process_kernel_args(int *);
+
+void consinit(void);
+void early_clkman(u_int, int);
+void kgdb_port_init(void);
+void change_clock(uint32_t v);
+
+bs_protos(bs_notimpl);
+
+#include "com.h"
+#if NCOM > 0
+#include <dev/ic/comvar.h>
+#include <dev/ic/comreg.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;
+
+struct gpio_map {
+ int gpio;
+ int fn;
+};
+
+struct gpio_map palm_gpio_map[] = {
+ /* FFUART aka serial port on the connector */
+ {34, GPIO_ALT_FN_1_IN},
+ {39, GPIO_ALT_FN_2_OUT},
+
+ /* STUART aka. IrDA */
+ {46, GPIO_ALT_FN_2_IN},
+ {47, GPIO_ALT_FN_1_OUT},
+
+ /* Keypad controller */
+ {100, GPIO_ALT_FN_1_IN},
+ {101, GPIO_ALT_FN_1_IN},
+ {102, GPIO_ALT_FN_1_IN},
+ {97, GPIO_ALT_FN_3_IN},
+ {103, GPIO_ALT_FN_2_OUT},
+ {104, GPIO_ALT_FN_2_OUT},
+ {105, GPIO_ALT_FN_2_OUT},
+};
+
+inline void gpio_setup(struct gpio_map *map, int size);
+
+inline void
+gpio_setup(struct gpio_map *map, int size)
+{
+ int i;
+ for (i = 0; i < size; i++)
+ pxa2x0_gpio_set_function(map[i].gpio, map[i].fn);
+}
+
+/*
+ * void boot(int howto)
+ *
+ * Reboots the system
+ *
+ * Deal with any syncing, unmounting, dumping and shutdown hooks,
+ * then reset the CPU.
+ */
+void
+boot(int howto)
+{
+ if (cold) {
+ /*
+ * If the system is cold, just halt, unless the user
+ * explicitely asked for reboot.
+ */
+ if ((howto & RB_USERREQ) == 0)
+ howto |= RB_HALT;
+ goto haltsys;
+ }
+
+ /*
+ * 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(howto);
+
+ /* Say NO to interrupts */
+ splhigh();
+
+ /* Do a dump if requested. */
+ if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP)
+ dumpsys();
+
+haltsys:
+ doshutdownhooks();
+
+ /* Make sure IRQ's are disabled */
+ IRQdisable;
+
+ if (howto & RB_HALT) {
+#if NAPM > 0
+ if (howto & RB_POWERDOWN) {
+
+ printf("\nAttempting to power down...\n");
+ delay(6000000);
+ zapm_poweroff();
+ }
+#endif
+
+ printf("The operating system has halted.\n");
+ printf("Please press any key to reboot.\n\n");
+ cnpollc(1);
+ cngetc();
+ cnpollc(0);
+ }
+
+ printf("rebooting...\n");
+ delay(6000000);
+#if NAPM > 0
+ zapm_restart();
+#endif
+ printf("reboot failed; spinning\n");
+ while(1);
+ /*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[] = {
+ {
+ PALM_GPIO_VBASE,
+ PXA2X0_GPIO_BASE,
+ PXA2X0_GPIO_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ PALM_CLKMAN_VBASE,
+ PXA2X0_CLKMAN_BASE,
+ PXA2X0_CLKMAN_SIZE,
+ PTE_NOCACHE,
+ },
+ {
+ PALM_INTCTL_VBASE,
+ PXA2X0_INTCTL_BASE,
+ PXA2X0_INTCTL_SIZE,
+ 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) {
+ vsize_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 = PALM_VBASE_FREE;
+
+static int
+bootstrap_bs_map(void *t, bus_addr_t bpa, bus_size_t size,
+ int flags, 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 = PALM_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 */
+
+ }
+}
+
+#if 0
+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);
+}
+#endif
+
+/*
+ * 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;
+ extern cpu_kcore_hdr_t cpu_kcore_hdr;
+ int loop;
+ int loop1;
+ u_int l1pagetable;
+ pv_addr_t kernel_l1pt;
+ paddr_t memstart;
+ psize_t memsize;
+ extern u_int32_t esym; /* &_end if no symbols are loaded */
+
+#if 0
+ int led_data = 0;
+#endif
+#ifdef DIAGNOSTIC
+ extern vsize_t xscale_minidata_clean_size; /* used in KASSERT */
+#endif
+ /* early bus_space_map support */
+ struct bus_space tmp_bs_tag;
+ int (*map_func_save)(void *, bus_addr_t, bus_size_t, int,
+ bus_space_handle_t *);
+
+
+#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!");
+
+ /* 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();
+ }
+
+ /*
+ * Examine the boot args string for options we need to know about
+ * now.
+ */
+ /* XXX should really be done after setting up the console, but we
+ * XXX need to parse the console selection flags right now. */
+ process_kernel_args((int *)0x5c000000);
+
+ /*
+ * This test will work for now but has to be revised when support
+ * for other models is added.
+ */
+
+ /* setup GPIO for BTUART, in case bootloader doesn't take care of it */
+ pxa2x0_gpio_bootstrap(PALM_GPIO_VBASE);
+
+ /*
+ * Do GPIO setup
+ */
+ gpio_setup(palm_gpio_map, sizeof(palm_gpio_map)/sizeof(struct gpio_map));
+
+#ifdef COM_PXA2X0
+ /* tell com to drive STUART in slow infrared mode */
+ comsiraddr = (bus_addr_t)PXA2X0_STUART_BASE;
+#endif
+#if 1
+ /* turn on clock to UART block.
+ XXX this should not be necessary, consinit() will do it */
+ early_clkman(CKEN_FFUART | CKEN_BTUART | CKEN_STUART, 1);
+#endif
+
+ /*
+ * Temporarily replace bus_space_map() functions so that
+ * console devices can get mapped.
+ *
+ * Note that this relies upon the fact that both regular
+ * and a4x bus_space tags use the same map function.
+ */
+ tmp_bs_tag = pxa2x0_bs_tag;
+ tmp_bs_tag.bs_map = bootstrap_bs_map;
+ map_func_save = pxa2x0_bs_tag.bs_map;
+#ifdef COM_PXA2X0
+ pxa2x0_a4x_bs_tag.bs_map = pxa2x0_bs_tag.bs_map = bootstrap_bs_map;
+#endif
+ /* setup a serial console for very early boot */
+ consinit();
+#ifdef KGDB
+ kgdb_port_init();
+#endif
+
+
+ /* Talk to the user */
+ printf("\nOpenBSD/Palm booting ...\n");
+
+ {
+ /* XXX - all Palm have this for now, fix memory sizing */
+ memstart = SDRAM_START;
+ memsize = SDRAM_SIZE;
+ }
+
+#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");
+
+ /*
+ * 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
+ * and the symbol table. */
+ {
+ extern char etext[];
+ size_t textsize = (u_int32_t) etext - KERNEL_TEXT_BASE;
+ size_t totalsize = esym - KERNEL_TEXT_BASE;
+ u_int logical;
+
+ textsize = (textsize + PGOFSET) & ~PGOFSET;
+ totalsize = (totalsize + PGOFSET) & ~PGOFSET;
+
+ logical = 0x00200000; /* offset of kernel in RAM */
+
+ /* Update dump information */
+ cpu_kcore_hdr.kernelbase = KERNEL_BASE;
+ cpu_kcore_hdr.kerneloffs = logical;
+ cpu_kcore_hdr.staticsize = totalsize;
+
+ logical += pmap_map_chunk(l1pagetable, KERNEL_BASE + logical,
+ physical_start + logical, textsize,
+ VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
+ 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.
+ */
+ {
+ physical_freestart = physical_start +
+ (((esym + 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
+
+ /* set new intc register address so that splfoo() doesn't
+ touch illegal address. */
+ pxa2x0_intr_bootstrap(PALM_INTCTL_VBASE);
+
+ 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));
+
+ /*
+ * 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
+
+ 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 slightly 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
+ pmap_bootstrap((pd_entry_t *)kernel_l1pt.pv_va, KERNEL_VM_BASE,
+ KERNEL_VM_BASE + KERNEL_VM_SIZE);
+
+ /* Update dump information */
+ cpu_kcore_hdr.pmap_kernel_l1 = (u_int32_t)pmap_kernel()->pm_l1;
+ cpu_kcore_hdr.pmap_kernel_l2 = (u_int32_t)&(pmap_kernel()->pm_l2);
+
+#ifdef __HAVE_MEMORY_DISK__
+ md_root_setconf(memory_disk, sizeof memory_disk);
+#endif
+
+#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
+
+ /*
+ * Restore proper bus_space operation, now that pmap is initialized.
+ */
+#ifdef COM_PXA2X0
+ pxa2x0_a4x_bs_tag.bs_map = pxa2x0_bs_tag.bs_map = map_func_save;
+#endif
+
+#ifdef DDB
+ db_machine_init();
+
+ /* Firmware doesn't load symbols. */
+ ddb_init();
+
+ if (boothowto & RB_KDB)
+ Debugger();
+#endif
+
+ /* We return the new stack pointer address */
+ return(kernelstack.pv_va + USPACE_SVC_STACK_TOP);
+}
+
+const char *console = "glass";
+
+inline void
+process_kernel_args(int *args)
+{
+ if (args[0] == 917 || /* Palm T5 */
+ args[0] == 885 || /* Palm TX */
+ args[0] == 835 || /* Palm LD */
+ args[0] == 904) /* Palm Z72 */
+ mach = args[0];
+}
+
+#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)
+{
+#if (NCOM > 0) && defined(COM_PXA2X0)
+ static int consinit_called = 0;
+ paddr_t paddr;
+ u_int cken = 0;
+
+ if (consinit_called != 0)
+ return;
+
+ consinit_called = 1;
+
+#ifdef KGDB
+ if (strcmp(kgdb_devname, console) == 0) {
+ /* port is reserved for kgdb */
+ } else
+#endif
+ if (strcmp(console, "ffuart") == 0) {
+ paddr = PXA2X0_FFUART_BASE;
+ cken = CKEN_FFUART;
+ } else if (strcmp(console, "btuart") == 0) {
+ paddr = PXA2X0_BTUART_BASE;
+ cken = CKEN_BTUART;
+ } else if (strcmp(console, "stuart") == 0) {
+ paddr = PXA2X0_STUART_BASE;
+ cken = CKEN_STUART;
+ }
+ if (cken != 0 && comcnattach(&pxa2x0_a4x_bs_tag, paddr, comcnspeed,
+ PXA2X0_COM_FREQ, comcnmode) == 0) {
+ early_clkman(cken, 1);
+ }
+#endif /* NCOM */
+}
+
+#ifdef KGDB
+void
+kgdb_port_init(void)
+{
+#if (NCOM > 0) && defined(COM_PXA2X0)
+ paddr_t paddr;
+ u_int cken;
+
+ if (strcmp(kgdb_devname, "ffuart") == 0) {
+ paddr = PXA2X0_FFUART_BASE;
+ cken = CKEN_FFUART;
+ } else if (strcmp(kgdb_devname, "btuart") == 0) {
+ paddr = PXA2X0_BTUART_BASE;
+ cken = CKEN_BTUART;
+ } else if (strcmp(kgdb_devname, "stuart") == 0) {
+ paddr = PXA2X0_STUART_BASE;
+ cken = CKEN_STUART;
+ irda_on(0);
+ } else
+ return;
+
+ if (com_kgdb_attach_pxa2x0(&pxa2x0_a4x_bs_tag, paddr,
+ kgdb_rate, PXA2X0_COM_FREQ, COM_TYPE_PXA2x0, comkgdbmode) == 0) {
+ early_clkman(cken, 1);
+ }
+#endif
+}
+#endif
+
+/* same as pxa2x0_clkman, but before autoconf */
+void
+early_clkman(u_int clk, int enable)
+{
+ u_int32_t rv;
+
+ rv = ioreg_read(PALM_CLKMAN_VBASE + CLKMAN_CKEN);
+ if (enable)
+ rv |= clk;
+ else
+ rv &= ~clk;
+ ioreg_write(PALM_CLKMAN_VBASE + CLKMAN_CKEN, rv);
+}
+
+int glass_console = 0;
+
+void
+board_startup(void)
+{
+ extern int lcd_cnattach(void (*)(u_int, int));
+#ifdef COM_PXA2X0
+ extern bus_addr_t comconsaddr;
+#endif
+
+#if NWSDISPLAY > 0
+ /*
+ * Try to attach the display console now that VM services
+ * are available.
+ */
+
+// if ((cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA27X) {
+ if (strcmp(console, "glass") == 0) {
+ printf("attempting to switch console to lcd screen\n");
+ glass_console = 1;
+ }
+ if (glass_console == 1 && lcd_cnattach(early_clkman) == 0) {
+ /*
+ * Kill the existing serial console.
+ * XXX need to bus_space_unmap resources and disable
+ * clocks...
+ */
+ comconsaddr = 0;
+
+ /*
+ * Display the copyright notice again on the new console
+ */
+ extern const char copyright[];
+ printf("%s\n", copyright);
+ printf("OpenBSD running on: %s\n", mach_name());
+ }
+// }
+#endif
+
+ if (boothowto & RB_CONFIG) {
+#ifdef BOOT_CONFIG
+ user_config();
+#else
+ printf("kernel does not support -c; continuing..\n");
+#endif
+ }
+}
diff --git a/sys/arch/palm/palm/palm_start.S b/sys/arch/palm/palm/palm_start.S
new file mode 100644
index 00000000000..ac53c30dcfa
--- /dev/null
+++ b/sys/arch/palm/palm/palm_start.S
@@ -0,0 +1,172 @@
+/* $OpenBSD: palm_start.S,v 1.1 2009/09/05 01:22:11 marex Exp $ */
+/* $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 */
+#include <machine/palm_var.h>
+
+/*
+ * 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(palm_start)
+_C_LABEL(palm_start):
+ /* Are we running on ROM ? */
+ cmp pc, #0x06000000
+ bhi palm_start_ram
+
+ /* move me to RAM
+ * XXX: we can use memcpy if it is PIC
+ */
+ ldr r1, Lcopy_size
+ adr r0, _C_LABEL(palm_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(palm_start)
+Lstart_off: .word palm_start_ram-_C_LABEL(palm_start)
+
+palm_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, SDRAM_SIZE_MB, 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, SDRAM_SIZE_MB, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
+
+ .word 0 /* end of table */