mmp3/ariel: add Dell Ariel board support
This is the board used in Dell Wyse 3020 thin client. It's based on
MMP3, reusing most of OLPC XO-4 support.
diff --git a/cpu/arm/mmp3/ariel/build-fw.fth b/cpu/arm/mmp3/ariel/build-fw.fth
new file mode 100644
index 0000000..6b4e06f
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/build-fw.fth
@@ -0,0 +1,604 @@
+purpose: Common code for build OFW Forth dictionaries for Dell Ariel (Wyse 3020)
+\ See license at end of file
+
+hex
+
+warning @ warning off
+: stand-init-io
+ stand-init-io
+ init-timers
+;
+warning !
+
+root-device
+ " Dell Ariel" model
+ " marvell,mmp3" +compatible
+ " dell,wyse-ariel" +compatible
+
+ " /interrupt-controller@d4282000" encode-phandle " interrupt-parent" property
+ 0 0 " ranges" property
+device-end
+
+fload ${BP}/cpu/arm/olpc/fbnums.fth
+fload ${BP}/cpu/arm/olpc/fbmsg.fth
+
+fload ${BP}/dev/omap/diaguart.fth
+
+d# 26000000 to uart-clock-frequency
+
+\ CForth has already set up the serial port
+: inituarts ( -- ) ;
+
+fload ${BP}/forth/lib/sysuart.fth \ Set console I/O vectors to UART
+
+: poll-tty ( -- ) ubreak? if user-abort then ; \ BREAK detection
+: install-abort ( -- ) ['] poll-tty d# 100 alarm ;
+
+0 value dcon-ih
+0 value keyboard-ih
+
+fload ${BP}/ofw/core/muxdev.fth \ I/O collection/distribution device
+
+\ Install the simple UART driver from the standalone I/O init chain
+warning off
+: stand-init-io ( -- )
+ stand-init-io
+ inituarts install-uart-io install-abort
+;
+warning on
+
+[ifdef] use-null-nvram
+\ For not storing configuration variable changes across reboots ...
+\ This is useful for "turnkey" systems where configurability would
+\ increase support costs.
+
+fload ${BP}/cpu/x86/pc/nullnv.fth
+stand-init: Null-NVRAM
+ " /null-nvram" open-dev to nvram-node
+ ['] init-config-vars catch drop
+;
+[then]
+
+[ifdef] use-flash-nvram
+\ For configuration variables stored in a sector of the boot FLASH ...
+
+\ Create a node below the top-level FLASH node to access the portion
+\ containing the configuration variables.
+0 0 " d0000" " /flash" begin-package
+ " nvram" device-name
+
+ h# 10000 constant /device
+ fload ${BP}/dev/subrange.fth
+end-package
+
+stand-init: NVRAM
+ " /nvram" open-dev to nvram-node
+ ['] init-config-vars catch drop
+;
+[then]
+
+\ Create a pseudo-device that presents the dropin modules as a filesystem.
+fload ${BP}/ofw/fs/dropinfs.fth
+
+\ This devalias lets us say, for example, "dir rom:"
+devalias rom /dropin-fs
+
+fload ${BP}/cpu/arm/mmp3/l2cache.fth
+fload ${BP}/cpu/arm/mmp3/cpunode.fth
+fload ${BP}/cpu/arm/mmp3/scu.fth
+
+fload ${BP}/cpu/arm/mmp2/watchdog.fth \ reset-all using watchdog timer
+
+fload ${BP}/cpu/arm/mmp2/twsi-i2c.fth
+devalias i2c2 /i2c@d4011000
+dev /i2c@d4011000
+ new-device
+ fload ${BP}/dev/ds1338.fth
+ finish-device
+ new-device
+ fload ${BP}/dev/88pm867.fth
+ finish-device
+device-end
+devalias i2c3 /i2c@d4032000
+dev /i2c@d4032000
+ new-device
+ fload ${BP}/dev/video/dacs/ch7033.fth
+ finish-device
+device-end
+devalias i2c4 /i2c@d4033800
+devalias i2c5 /i2c@d4033000
+devalias i2c6 /i2c@d4034000
+dev /i2c@d4033000
+ new-device
+ fload ${BP}/dev/kb3930.fth
+ finish-device
+device-end
+dev /i2c@d4031000 " disabled" " status" string-property device-end
+
+0 0 " " " /" begin-package
+ " dvi-connector" name
+ " dvi-connector" +compatible
+ " /i2c@d4033800" encode-phandle " ddc-i2c-bus" property
+
+ " /gpio" encode-phandle
+ dvi1-hpd-gpio# encode-int encode+
+ d# 1 encode-int encode+
+ " hpd-gpios" property
+
+ 0 0 " digital" property
+ 0 0 " analog" property
+
+ new-device
+ " port" device-name
+ new-device
+ " endpoint" device-name
+ finish-device
+ finish-device
+end-package
+
+" /dvi-connector/port/endpoint" " /vga-dvi-encoder/ports/port@1/endpoint" link-endpoints
+
+fload ${BP}/cpu/arm/mmp2/uart.fth
+dev /uart@d4030000 " disabled" " status" string-property device-end
+dev /uart@d4017000 " disabled" " status" string-property device-end
+dev /uart@d4016000 " disabled" " status" string-property device-end
+
+devalias serial2 /uart@d4018000
+: com1 " /uart@d4018000" ;
+' com1 is fallback-device
+
+\ \needs md5init fload ${BP}/ofw/ppp/md5.fth \ MD5 hash
+
+fload ${BP}/dev/olpc/spiflash/flashif.fth \ Generic FLASH interface
+
+fload ${BP}/dev/olpc/spiflash/spiif.fth \ Generic low-level SPI bus access
+
+fload ${BP}/dev/olpc/spiflash/spiflash.fth \ SPI FLASH programming
+
+fload ${BP}/cpu/arm/mmp2/sspspi.fth \ Synchronous Serial Port SPI interface
+
+fload ${BP}/cpu/arm/mmp2/ssp-spi.fth \ SSP device nodes
+dev /spi@d4035000
+ " /gpio" encode-phandle
+ spi-flash-cs-gpio# encode-int encode+
+ d# 1 encode-int encode+
+ " cs-gpios" property
+
+ \ Create the top-level device node to access the entire boot FLASH device
+ new-device
+ " flash" device-name
+ " jedec,spi-nor" +compatible
+ " winbond,w25q32" +compatible
+ d# 104000000 " spi-max-frequency" integer-property
+ 0 0 " m25p,fast-read" property
+ 0 " reg" integer-property
+ /rom value /device
+ fload ${BP}/dev/nonmmflash.fth
+ finish-device
+device-end
+dev /spi@d4036000 " disabled" " status" string-property device-end
+dev /spi@d4037000 " disabled" " status" string-property device-end
+dev /spi@d4039000 " disabled" " status" string-property device-end
+
+\ Create a node below the top-level FLASH node to accessing the portion
+\ containing the dropin modules
+0 0 " 20000" " /flash" begin-package
+ " dropins" device-name
+
+ /rom h# 20000 - constant /device
+ fload ${BP}/dev/subrange.fth
+end-package
+
+devalias dropins /dropins
+
+load-base constant flash-buf
+
+fload ${BP}/cpu/arm/mmp3/ariel/spiui.fth \ User interface for SPI FLASH programming
+
+\ Reserve memory for the framebuffer
+0 0 " " " /" begin-package
+ " reserved-memory" name
+ 1 " #address-cells" integer-property
+ 1 " #size-cells" integer-property
+ 0 0 encode-bytes " ranges" property
+
+ new-device
+ " framebuffer" device-name
+ " marvell,armada-framebuffer" +compatible
+ " marvell,mmp2-framebuffer" +compatible
+ h# 02000000 " size" integer-property
+ h# 02000000 " alignment" integer-property
+ 0 0 encode-bytes " no-map" property
+ finish-device
+end-package
+
+0 0 " f0400000" " /" begin-package
+ " vmeta" name
+ my-address my-space h# 400000 reg
+
+ " mrvl,mmp2-vmeta" +compatible
+
+ " /clocks" encode-phandle mmp2-vmeta-clk# encode-int encode+ " clocks" property
+ " VMETACLK" " clock-names" string-property
+ d# 26 " interrupts" integer-property
+end-package
+
+fload ${BP}/cpu/arm/mmp3/ariel/lcdcfg.fth
+fload ${BP}/cpu/arm/olpc/lcd.fth
+
+" /display/port/endpoint" " /vga-dvi-encoder/ports/port@0/endpoint" link-endpoints
+
+fload ${BP}/cpu/arm/mmp3/galcore.fth
+
+\ fload ${BP}/cpu/arm/mmp3/ariel/sdhci.fth
+
+fload ${BP}/cpu/arm/mmp2/sdhci.fth
+dev /sdhci@d4281000
+ d# 15 encode-int " clk-delay-cycles" property
+ d# 50000000 " max-frequency" integer-property
+ 0 0 " non-removable" property
+ d# 8 " bus-width" integer-property
+ 0 0 " cap-mmc-highspeed" property
+
+ : write-protected? false ;
+ new-device
+ fload ${BP}/dev/mmc/sdhci/sdmmc.fth
+ fload ${BP}/dev/mmc/sdhci/selftest.fth
+ " internal" " slot-name" string-property
+ finish-device
+device-end
+dev /sdhci@d4280000 " disabled" " status" string-property device-end
+dev /sdhci@d4280800 " disabled" " status" string-property device-end
+dev /sdhci@d4281800 " disabled" " status" string-property device-end
+devalias int /sd/sdhci@d4281000/disk
+
+0 0 " " " /" begin-package
+ " spi" device-name
+ " spi-gpio" +compatible
+ 1 " #address-cells" integer-property
+ 0 " #size-cells" integer-property
+
+ : decode-unit ( adr len -- phys ) $number if 0 then ;
+ : encode-unit ( phys -- adr len ) (u.) ;
+ : open ( -- true ) true ;
+ : close ( -- ) ;
+
+ " /gpio" encode-phandle d# 55 encode-int encode+ d# 0 encode-int encode+ " gpio-sck" property
+ " /gpio" encode-phandle d# 57 encode-int encode+ d# 0 encode-int encode+ " gpio-miso" property
+ " /gpio" encode-phandle d# 58 encode-int encode+ d# 0 encode-int encode+ " gpio-mosi" property
+ " /gpio" encode-phandle d# 56 encode-int encode+ d# 0 encode-int encode+ " cs-gpios" property
+
+ new-device
+ " power-button" name
+ 0 " reg" integer-property
+ " ene,kb3930-input" +compatible
+ " dell,wyse-ariel-ec-input" +compatible
+ d# 33000000 " spi-max-frequency" integer-property
+ " /gpio" encode-phandle " interrupt-parent" property
+ d# 60 encode-int d# 1 encode-int encode+ " interrupts" property
+ finish-device
+end-package
+
+fload ${BP}/ofw/core/fdt.fth
+
+autoload: mmp3-gic- defines: mmp3-gic
+0 value no-mmp3-gic?
+
+autoload: olpc-compat- defines: olpc-compat
+0 value olpc-compat?
+
+fload ${BP}/cpu/arm/linux.fth
+
+\ Create the alias unless it already exists
+: $?devalias ( alias$ value$ -- )
+ 2over not-alias? if $devalias exit then ( alias$ value$ alias$ )
+ 2drop 4drop
+;
+
+: ?report-device ( alias$ pathname$ -- )
+ 2dup locate-device 0= if ( alias$ pathname$ phandle )
+ drop ( alias$ pathname$ )
+ 2over 2over $?devalias ( alias$ pathname$ )
+ then ( alias$ pathname$ )
+ 4drop ( )
+;
+
+: report-disk ( -- )
+ " disk" " /usb@d4208000/disk" ?report-device
+;
+
+: report-keyboard ( -- )
+ " usb-keyboard" " /usb@d4208000/keyboard" ?report-device
+;
+
+: report-net ( -- )
+ " net" " /usb@f0001000/hub@1,0/ethernet@2,0" ?report-device
+;
+
+: disable-unpopulated ( -- )
+ " /usb@f0001000/hub@1,0/scsi@1,0" find-device
+ " disabled" " status" string-property
+ device-end
+;
+
+fload ${BP}/cpu/arm/mmp3/usb2phy.fth
+fload ${BP}/cpu/arm/olpc/usb.fth
+fload ${BP}/cpu/arm/mmp3/hsic.fth
+devalias u /usb@d4208000/disk
+
+fload ${BP}/cpu/arm/firfilter.fth
+
+fload ${BP}/cpu/x86/adpcm.fth \ ADPCM decoding
+d# 32 is playback-volume
+
+stand-init: RTC
+ " /i2c@d4011000/rtc@68" open-dev clock-node !
+ \ use RTC 32kHz clock as SoC external slow clock
+ h# 38 mpmu@ 1 or h# 38 mpmu!
+ \ check the clock stop flag and reinit if necessary
+ " verify" clock-node @ $call-method
+;
+
+stand-init: More memory
+ extra-mem-va /extra-mem add-memory
+;
+
+fload ${BP}/cpu/arm/mmp3/thermal.fth
+fload ${BP}/cpu/arm/mmp2/fuse.fth
+
+[ifndef] virtual-mode
+warning off
+: stand-init-io
+ stand-init-io
+ go-fast \ From mmuon.fth
+;
+warning on
+[then]
+
+\ The bottom of extra-mem is the top of DMA memory.
+\ We give everything up to that address to Linux.
+: olpc-memory-limit ( -- adr ) extra-mem-va >physical ;
+' olpc-memory-limit to memory-limit
+: olpc-mapped-limit ( -- adr ) dma-mem-va >physical ;
+' olpc-mapped-limit to mapped-limit
+
+machine-type to arm-linux-machine-type
+
+false to stand-init-debug?
+\ true to stand-init-debug?
+
+fload ${BP}/ofw/core/countdwn.fth \ Startup countdown
+
+hex
+: i-key-wait ( ms -- pressed? )
+ cr ." Type 'i' to interrupt stand-init sequence" cr ( ms )
+ 0 do
+ ukey? if
+ ukey upc ascii I = if true unloop exit then
+ then
+ d# 1000 us \ 1000 us is more precise than 1 ms, which is often close to 2 ms
+ loop
+ false
+;
+
+\ Uninstall the diag menu from the general user interface vector
+\ so exiting from emacs doesn't invoke the diag menu.
+' quit to user-interface
+
+: screen-#lines ( -- n )
+ screen-ih 0= if default-#lines exit then
+ screen-ih package( #lines )package
+;
+' screen-#lines to lines/page
+
+true value text-on?
+: text-off ( -- )
+ text-on? if
+ screen-ih remove-output
+ false to text-on?
+ then
+;
+: text-on ( -- )
+ text-on? 0= if
+ screen-ih add-output
+ cursor-on
+ true to text-on?
+ then
+;
+
+fload ${BP}/cpu/arm/mmp2/clocks.fth
+
+: console-start ( -- )
+ " /vga-dvi-encoder" open-dev to dcon-ih
+ install-mux-io
+ cursor-off
+ true to text-on?
+
+ " //null" open-dev to null-ih \ For text-off state
+;
+: keyboard-off ( -- )
+ keyboard-ih if
+ keyboard-ih remove-input
+ keyboard-ih close-dev
+ 0 to keyboard-ih
+ then
+;
+
+: teardown-mux-io ( -- )
+ install-uart-io
+ text-off
+ keyboard-off
+ fallback-out-ih remove-output
+ fallback-in-ih remove-input
+ stdin off
+ stdout off
+ in-mux-ih close-dev
+ out-mux-ih close-dev
+;
+: quiesce ( -- )
+ usb-quiet
+ teardown-mux-io
+ timers-off
+ unload-crypto
+;
+
+\ This must precede the loading of gui.fth, which chains from linux-hook's behavior
+' quiesce to linux-hook
+
+fload ${BP}/cpu/arm/mmp2/showirqs.fth
+
+fload ${BP}/cpu/arm/mmp3/dramrecal.fth
+: linux-hook-smp ( -- )
+ [ ' linux-hook behavior compile, ] \ Chain to old behavior
+ enable-smp
+;
+' linux-hook-smp to linux-hook
+
+code halt ( -- ) wfi c;
+
+fload ${BP}/cpu/arm/mmp2/rtc.fth \ Internal RTC, used for wakeups
+
+: emacs ( -- )
+ false to already-go?
+ boot-getline to boot-file " rom:emacs" $boot
+;
+: tsc@ ( -- d.ticks ) timer0@ u>d ;
+d# 6500 constant ms-factor
+
+fload ${BP}/cpu/arm/bootascall.fth
+
+d# 999 ' screen-#rows set-config-int-default \ Expand the terminal emulator to fill the screen
+d# 999 ' screen-#columns set-config-int-default \ Expand the terminal emulator to fill the screen
+
+fload ${BP}/cpu/x86/pc/olpc/gridmap.fth \ Gridded display tools
+fload ${BP}/cpu/x86/pc/olpc/life.fth
+fload ${BP}/ofw/gui/ofpong.fth
+
+" u:\boot\olpc.fth int:\boot\olpc.fth net" ' boot-device set-config-string-default
+
+\needs ramdisk " " d# 128 config-string ramdisk
+" " ' boot-file set-config-string-default \ Let the boot script set the cmdline
+
+2 config-int auto-boot-countdown
+
+\ Eliminate 4 second delay in install console for the case where
+\ there is no keyboard. The delay is unnecessary because the screen
+\ does not go blank when the device is closed.
+patch drop ms install-console
+
+alias reboot bye
+
+alias crcgen drop ( crc byte -- crc' )
+
+\ Dictionary growth size for the ARM Image Format header
+\ 1 section before origin section table
+h# 10.0000 h# 8000 - h# 4000 - dictionary-size !
+
+fload ${BP}/cpu/arm/saverom.fth \ Save the dictionary for standalone startup
+
+: interpreter-init ( -- )
+ hex
+ warning on
+ only forth also definitions
+
+ install-alarm
+
+ page-mode
+ #line off
+;
+
+: startup ( -- )
+ standalone? 0= if exit then
+
+ no-page
+
+ disable-user-aborts
+ console-start
+
+ " probe-" do-drop-in
+
+ unused-core-off
+
+ install-alarm
+
+ auto-banner? if banner then
+
+ ['] false to interrupt-auto-boot?
+ probe-usb
+ report-disk
+ report-keyboard
+ report-net
+ disable-unpopulated
+
+ " probe+" do-drop-in
+
+ interpreter-init
+
+ ['] (interrupt-auto-boot?) to interrupt-auto-boot?
+
+ ?usb-keyboard
+
+ auto-boot
+
+ cursor-on
+
+ enable-user-aborts
+ quit
+;
+
+: enable-serial ;
+fload ${BP}/cpu/x86/pc/olpc/terminal.fth \ Serial terminal emulator
+
+\ Embedded Controller interface
+
+0 value ec-ih
+
+: ec-power-off ( -- ) " power-off" ec-ih $call-method ;
+: ec-reboot ( -- ) " reboot" ec-ih $call-method ;
+' ec-power-off to power-off
+
+stand-init: Embedded Controller
+ " /embedded-controller" open-dev to ec-ih
+ ['] ec-reboot to bye
+ \ Start turn off amber, turn on green LED
+ " leds-start" ec-ih $call-method
+ \ Power on the USB ports, just in case EC had them disabled
+ " usb-ports-power-on" ec-ih $call-method
+;
+
+: (go-hook) ( -- )
+ [ ' go-hook behavior compile, ]
+ \ Start flashing green upon booot
+ " leds-boot" ec-ih $call-method
+;
+' (go-hook) to go-hook
+
+\ These allow booting Fedora XO images
+: show-sad ;
+: visible ;
+: unfreeze ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 FirmWorks
+\ Copyright (c) 2020 Lubomir Rintel <lkundrak@v3.sk>
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
diff --git a/cpu/arm/mmp3/ariel/build/.gitignore b/cpu/arm/mmp3/ariel/build/.gitignore
new file mode 100644
index 0000000..66f087a
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/build/.gitignore
@@ -0,0 +1,3 @@
+armforth
+build/build
+cforth
diff --git a/cpu/arm/mmp3/ariel/build/Makefile b/cpu/arm/mmp3/ariel/build/Makefile
new file mode 100644
index 0000000..000b744
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/build/Makefile
@@ -0,0 +1,70 @@
+ROMNAME=ofw
+
+BASEDIR= `(cd ../../../../..; pwd;)`
+
+OS := $(shell uname)
+HOSTCPU= $(shell ${BASEDIR}/forth/lib/hostcpu.sh)
+HOSTDIR= ../../../../${HOSTCPU}/${OS}
+BUILDSH= ${BASEDIR}/forth/lib/build.sh
+
+TAGFILES= ../../../build/*.tag *.tag
+CLIENTDIR=../../../../../clients
+CLIENTPROGS=${CLIENTDIR}/emacs/arm/emacs
+
+all: ${ROMNAME}.rom tags
+
+${ROMNAME}.tag: ${ROMNAME}.rom
+
+tags: ${ROMNAME}.tag
+ @${BASEDIR}/forth/lib/toctags ${BASEDIR} ${TAGFILES}
+
+${ROMNAME}.rom: FORCE build ${CLIENTPROGS} ${HOSTDIR}/forth ${HOSTDIR}/armforth
+ ./build $@
+
+${HOSTDIR}/forth:
+ @make -C ${HOSTDIR} forth
+
+${HOSTDIR}/armforth:
+ @make -C ${HOSTDIR} armforth
+
+../../build/inflate.bin:
+ @make -C ../../build inflate.bin
+
+${CLIENTDIR}/emacs/arm/emacs:
+ @make -C ${CLIENTDIR}/emacs/arm emacs
+
+build:
+ @ln -sf ${BUILDSH} build
+
+clean:
+ rm -f *.dic *.log headers *~ *.elf *.di *.img builton.fth build *.rom tags *.tag
+
+clean-all: clean
+ @make -C ../../build clean
+ @make -C ${HOSTDIR} clean
+
+.PHONY: FORCE clean all clean-all
+
+# LICENSE_BEGIN
+# Copyright (c) 2009 FirmWorks
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# LICENSE_END
diff --git a/cpu/arm/mmp3/ariel/cforth.bth b/cpu/arm/mmp3/ariel/cforth.bth
new file mode 100644
index 0000000..5807bab
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/cforth.bth
@@ -0,0 +1,9 @@
+purpose: Fetch and compile CForth for IPL on the MM core
+
+command: &builder &this
+build-now
+
+macro: CFORTH_VERSION d111f9ffe1732b706addb08a96d4cba7e26bb93a
+macro: CFORTH_BUILD_DIR cforth/build/arm-ariel
+
+fload ${BP}/cpu/arm/olpc/build-cforth.fth
diff --git a/cpu/arm/mmp3/ariel/config.fth b/cpu/arm/mmp3/ariel/config.fth
new file mode 100644
index 0000000..f6f8b27
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/config.fth
@@ -0,0 +1,15 @@
+create use-null-nvram
+create use-elf
+
+fload ${BP}/cpu/arm/mmp3/soc-config.fth
+fload ${BP}/cpu/arm/mmp2/hwaddrs.fth
+fload ${BP}/cpu/arm/olpc/addrs.fth
+fload ${BP}/cpu/arm/mmp3/ariel/gpiopins.fth
+
+h# 40.0000 constant /rom \ Total size of SPI FLASH
+
+: crc-offset /rom h# 30 - ; \ e.g. 3f.ffd0
+: signature-offset crc-offset h# 10 - ; \ e.g. 3e.ffc0
+: signature$ " Ariel" ;
+
+d# 4154 constant machine-type \ MACH_QSEVEN
diff --git a/cpu/arm/mmp3/ariel/fw.bth b/cpu/arm/mmp3/ariel/fw.bth
new file mode 100644
index 0000000..a053f40
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/fw.bth
@@ -0,0 +1,13 @@
+purpose: Build OFW Forth dictionary for Dell Ariel (Wyse 3020)
+
+dictionary: ${BP}/cpu/arm/mmp3/ariel/build/prefw.dic
+command: &armforth &dictionary &this
+build-now
+
+" fw.tag" r/w create-file drop tag-file !
+
+fload ${BP}/cpu/arm/mmp3/ariel/build-fw.fth
+
+h# d4018000 to uart-base
+
+fload ${BP}/cpu/arm/olpc/save-fw.fth
diff --git a/cpu/arm/mmp3/ariel/gpiopins.fth b/cpu/arm/mmp3/ariel/gpiopins.fth
new file mode 100644
index 0000000..d25d05f
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/gpiopins.fth
@@ -0,0 +1,9 @@
+\ GPIO pin assignments - Ariel
+
+d# 46 constant spi-flash-cs-gpio#
+d# 56 constant ec-input-gpio#
+d# 59 constant hdmi-hp-det-gpio#
+d# 62 constant dvi1-hpd-gpio#
+d# 63 constant hsic-reset-gpio#
+d# 126 constant ec-off-pulse-gpio#
+d# 127 constant ec-off-type-gpio#
diff --git a/cpu/arm/mmp3/ariel/lcdcfg.fth b/cpu/arm/mmp3/ariel/lcdcfg.fth
new file mode 100644
index 0000000..9e31fa0
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/lcdcfg.fth
@@ -0,0 +1,16 @@
+h# 20001101 value clkdiv
+h# 00000C00 value pmua-disp-clk-sel
+
+d# 136 value hsync \ Sync width
+d# 1024 value hdisp \ Display width
+d# 1344 value htotal \ Display + FP + Sync + BP
+d# 160 value hbp \ Back porch
+
+d# 6 value vsync \ Sync width
+d# 768 value vdisp \ Display width
+d# 806 value vtotal \ Display + FP + Sync + BP
+d# 29 value vbp \ Back porch
+
+4 value #lanes
+4 value bytes/pixel
+d# 32 value bpp
diff --git a/cpu/arm/mmp3/ariel/ofw.bth b/cpu/arm/mmp3/ariel/ofw.bth
new file mode 100644
index 0000000..f847e4e
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/ofw.bth
@@ -0,0 +1,132 @@
+purpose: Construct the Open Firmware module collection
+
+command: &builder &this
+in: ${BP}/cpu/arm/mmp3/ariel/build/fw.img
+in: ${BP}/cpu/arm/mmp3/ariel/build/resetvec.img
+in: ${BP}/dev/usb2/device/hub/build/hub.fc
+in: ${BP}/dev/usb2/device/generic/build/generic.fc
+in: ${BP}/dev/usb2/device/net/build/usbnet.fc
+in: ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc
+in: ${BP}/dev/usb2/device/mouse/build/usbmouse.fc
+in: ${BP}/dev/usb2/device/serial/build/usbserial.fc
+in: ${BP}/dev/usb2/device/storage/build/usbstorage.fc
+in: ${BP}/clients/emacs/arm/emacs
+in: cforth.img
+build-now
+
+fload ${BP}/cpu/arm/mmp3/ariel/config.fth
+
+\ Always re-create the builton.fth file when we make a new rom.img
+fload ${BP}/cpu/x86/pc/builton.bth
+
+fload ${BP}/forth/lib/crc32.fth
+
+hex
+
+: pad-file ( location -- )
+ ofd @ fsize
+ 2dup u< abort" The ROM image is too large"
+ ?do h# ff ofd @ fputc loop
+;
+
+fload ${BP}/cpu/arm/marvell/tim.fth
+
+\ Marvell Non-Trusted Image Module image creation script for XO-4.0 platform.
+
+tim: 00030400 0 DELL PXA212x
+ flash: SPI'10
+ timh: TIMH 0 d101f000
+ image: OBMI 2000 d1000000 cforth.img
+ reserved:
+ \ Disable USB download/init by enabling the FFUART for download
+ \ This works around a PHY init erratum for the B0 chip
+ uart: 00004646 1
+ term:
+ end-reserved
+end-tim
+
+h# 20.0000 to reserved-start
+h# 20.0000 to reserved-end
+
+.( --- Saving as ofw.rom ) cr
+writing ofw.rom
+ tim$ ofd @ fputs
+
+ dropin-offset pad-file
+
+\ Loads the set of drivers that is common to different output formats
+
+ " ${BP}/cpu/arm/build/inflate.bin" " inflate" $add-dropin
+ " fw.img" " firmware" $add-deflated-dropin
+\ " fw.img" " firmware" $add-dropin
+ " resetvec.img" " reset" $add-dropin
+
+ " ${BP}/cpu/arm/mmp3/gic.fth" " mmp3-gic-" $add-dropin
+ " ${BP}/cpu/arm/olpc/4.0/compat.fth" " olpc-compat-" $add-dropin
+\ " ${BP}/dev/usb2/hcd/ehci/build/ehci.fc" " class0c0320" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/hub/build/hub.fc" " usb,class9" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/generic/build/generic.fc" " usbdevice" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/net/build/usbnet.fc" " usbnet" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc" " usb,class3,1,1" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/mouse/build/usbmouse.fc" " usb,class3,1,2" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/serial/build/usbserial.fc" " usbserial" $add-deflated-dropin
+ " ${BP}/dev/usb2/device/storage/build/usbstorage.fc" " usbstorage" $add-deflated-dropin
+
+ " builton.fth" " probe-" $add-dropin
+
+ " ${BP}/ofw/inet/telnetd.fth" " telnetd" $add-deflated-dropin
+
+ " ${BP}/ofw/termemu/gallant.obf" " font" $add-deflated-dropin
+
+ " ${BP}/clients/emacs/x86/emacs.rc" " emacs.rc" $add-deflated-dropin
+ " ${BP}/clients/emacs/emacs.hlp" " emacs.hlp" $add-deflated-dropin
+ " ${BP}/clients/emacs/arm/emacs" " emacs" $add-deflated-dropin
+
+.( Dropin top is ) ofd @ fsize .x cr
+
+/rom pad-file
+
+\ Insert the machine signature
+h# 10 buffer: signature
+signature h# 10 blank
+signature$ signature swap move
+signature-offset ofd @ fseek
+signature h# 10 ofd @ fputs
+
+/l buffer: crcbuf
+/rom buffer: filebuf
+
+\ Read the entire image, compute the CRC, and store it in the CRC location
+0 ofd @ fseek
+filebuf /rom ofd @ fgets /rom <> abort" Can't read back image"
+0 crctab filebuf /rom ($crc) crcbuf !
+
+crc-offset ofd @ fseek
+crcbuf /l ofd @ fputs
+
+ofd @ fclose
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 FirmWorks
+\ Copyright (c) 2020 Lubomir Rintel <lkundrak@v3.sk>
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END
diff --git a/cpu/arm/mmp3/ariel/prefw.bth b/cpu/arm/mmp3/ariel/prefw.bth
new file mode 100644
index 0000000..84140f7
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/prefw.bth
@@ -0,0 +1,13 @@
+purpose: Build OFW Forth dictionary for Dell Ariel (Wyse 3020)
+\ See license at end of file
+
+dictionary: ${BP}/cpu/arm/build/basefw.dic
+command: &armforth &dictionary &this
+build-now
+
+\ This line must be in this file instead of in prefw.fth so the definitions
+\ in config.fth will be tagged.
+" prefw.tag" r/w create-file drop tag-file !
+
+fload ${BP}/cpu/arm/mmp3/ariel/config.fth
+fload ${BP}/cpu/arm/olpc/prefw.fth
diff --git a/cpu/arm/mmp3/ariel/resetvec.bth b/cpu/arm/mmp3/ariel/resetvec.bth
new file mode 100644
index 0000000..a93ce4e
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/resetvec.bth
@@ -0,0 +1,7 @@
+purpose: Build script for low-level startup code
+
+command: &builder &this
+build-now
+
+fload ${BP}/cpu/arm/mmp3/ariel/config.fth
+fload ${BP}/cpu/arm/olpc/resetvec.fth
diff --git a/cpu/arm/mmp3/ariel/spiui.fth b/cpu/arm/mmp3/ariel/spiui.fth
new file mode 100644
index 0000000..5460bdf
--- /dev/null
+++ b/cpu/arm/mmp3/ariel/spiui.fth
@@ -0,0 +1,173 @@
+purpose: User interface for reflashing SPI FLASH parts
+\ See license at end of file
+
+\ This code is concerned with the user interface for getting
+\ a new firmware image into memory and using it to program
+\ a FLASH device from that image. The details of how to actually
+\ access the FLASH device are defined elsewhere.
+
+h# 4000 constant /chunk \ Convenient sized piece for progress reports
+
+defer spi-progress ' 2drop to spi-progress ( offset size -- )
+
+: write-flash-range ( adr end-offset start-offset -- )
+ ." Writing" cr
+ ?do ( adr )
+ \ Save time - don't write if the data is the same
+ i .x (cr ( adr )
+ spi-us d# 20 >= if ( adr )
+ \ Just write if reading is slow
+ true ( adr must-write? )
+ else ( adr )
+ dup /flash-block i flash-verify ( adr must-write? )
+ then ( adr must-write? )
+
+ if
+ i flash-erase-block
+ dup /flash-block i flash-write ( adr )
+ then
+ i /flash spi-progress ( adr )
+ /flash-block + ( adr' )
+ /flash-block +loop ( adr )
+ cr drop ( )
+;
+
+: verify-flash-range ( adr end-offset start-offset -- )
+ ." Verifying" cr
+ ?do ( adr )
+ i .x (cr
+ dup /flash-block i flash-verify abort" Verify failed"
+ /flash-block + ( adr' )
+ /flash-block +loop ( adr )
+ cr drop ( )
+;
+
+
+\ Perform a series of sanity checks on the new firmware image.
+
+0 value file-loaded?
+
+: crc ( adr len -- crc ) 0 crctab 2swap ($crc) ;
+
+: ?crc ( -- )
+ ." Checking integrity ..." cr
+
+ flash-buf crc-offset + ( crc-adr )
+ dup l@ >r ( crc-adr r: crc )
+ -1 over l! ( crc-adr r: crc )
+
+ flash-buf /flash crc ( crc-adr calc-crc r: crc )
+ r@ rot l! ( calc-crc r: crc )
+ r> <> abort" Firmware image has bad internal CRC"
+;
+
+: ?image-valid ( len -- )
+ /flash <> abort" Image file is the wrong length"
+
+ flash-buf signature-offset +
+ signature$ comp abort" Wrong machine signature"
+
+ ?crc
+;
+
+: $get-file ( "filename" -- )
+ $read-open
+ flash-buf h# 40.0000 ifd @ fgets ( len )
+ ifd @ fclose
+
+ ?image-valid
+
+ true to file-loaded?
+;
+
+: ?file ( -- )
+ file-loaded? 0= if
+ ." You must first load a valid FLASH image file with" cr
+ ." get-file filename" cr
+ abort
+ then
+;
+
+: read-flash ( "filename" -- )
+ writing
+ /flash 0 do
+ i .x (cr
+ flash-buf i + /chunk i flash-read
+ /chunk +loop
+ flash-buf /flash ofd @ fputs
+ ofd @ fclose
+;
+
+: verify ( -- ) ?file flash-buf /flash 0 verify-flash-range ;
+
+: write-firmware ( -- )
+ flash-buf /flash 0 write-flash-range \ Write first part
+;
+: verify-firmware ( -- )
+ flash-buf /flash 0 verify-flash-range \ Verify first part
+;
+
+: .verify-msg ( -- )
+ ." Type verify if you want to verify the data just written." cr
+ ." Verification will take about 17 minutes if the host is running Linux" cr
+ ." or about 5 minutes if the host is running OFW." cr
+;
+
+: reflash ( -- ) \ Flash from data already in memory
+ ?file
+ flash-write-enable
+
+ write-firmware
+
+ spi-us d# 20 < if
+ ['] verify-firmware catch if
+ ." Verify failed. Retrying once" cr
+ spi-identify
+ write-firmware
+ verify-firmware
+ then
+ /flash dup spi-progress
+ flash-write-disable
+ else
+ .verify-msg
+ then
+;
+
+defer fw-filename$ ' null$ to fw-filename$
+
+: get-file ( ["filename"] -- )
+ parse-word ( adr len )
+ dup 0= if 2drop fw-filename$ then ( adr len )
+ ." Reading " 2dup type cr ( adr len )
+ $get-file
+;
+
+: flash ( ["filename"] -- ) get-file reflash ;
+
+: safe-flash-read ( -- )
+ flash-buf /flash 0 flash-read
+;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2006 FirmWorks
+\
+\ Permission is hereby granted, free of charge, to any person obtaining
+\ a copy of this software and associated documentation files (the
+\ "Software"), to deal in the Software without restriction, including
+\ without limitation the rights to use, copy, modify, merge, publish,
+\ distribute, sublicense, and/or sell copies of the Software, and to
+\ permit persons to whom the Software is furnished to do so, subject to
+\ the following conditions:
+\
+\ The above copyright notice and this permission notice shall be
+\ included in all copies or substantial portions of the Software.
+\
+\ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+\ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+\ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+\ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+\ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+\ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+\ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\
+\ LICENSE_END