Author: wmb Date: 2008-05-21 23:12:54 +0200 (Wed, 21 May 2008) New Revision: 824
Added: cpu/x86/pc/linux.fth cpu/x86/pc/lxdevel/addrs.fth cpu/x86/pc/lxdevel/banner.fth cpu/x86/pc/lxdevel/loaddropins.fth cpu/x86/pc/lxdevel/rmstart.fth cpu/x86/pc/memtest.fth dev/geode/draminit.fth dev/geode/gpio.fth dev/geode/startmacros.fth dev/geode/usb.fth Modified: cpu/x86/pc/lxdevel/config.fth cpu/x86/pc/lxdevel/devices.fth cpu/x86/pc/lxdevel/fw.bth cpu/x86/pc/lxdevel/lxdevel.bth cpu/x86/pc/lxdevel/msrinit.fth cpu/x86/pc/lxdevel/pcinode.fth cpu/x86/pc/lxdevel/rmstart.bth cpu/x86/pc/lxdevel/romreset.bth cpu/x86/pc/lxdevel/versions.fth cpu/x86/pc/olpc/fw.bth cpu/x86/pc/olpc/romreset.bth cpu/x86/pc/olpc/versions.fth dev/geode/nandflash/methods.fth dev/geode/nandflash/nand5536.fth dev/geode/nandflash/nandflash.bth Log:
Fixed the lxdevel build by:
Moved some files that aren't really OLPC-specific from cpu/x86/pc/olpc into cpu/x86/pc and dev/geode, doing a little refactoring (mostly just moving code into different files) in the process.
Made lxdevel-specific versions of some files that contained OLPC dependencies
Removed spurious OLPC dependencies from the lxdevel build.
This change is intended to be functionally neutral for the OLPC build.
Added: cpu/x86/pc/linux.fth =================================================================== --- cpu/x86/pc/linux.fth (rev 0) +++ cpu/x86/pc/linux.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,331 @@ +\ See license at end of file +purpose: Linux bzImage program loading + +\ Example boot configuration variable settings: + +\ Example default values for a system that boots primarily from hard disk: + +\ \needs ramdisk " disk:\boot\initrd.img" d# 128 config-string ramdisk +\ " ro root=LABEL=OLPCRoot rootfstype=ext3 console=ttyS0,115200 console=tty0" +\ ' boot-file set-config-string-default +\ " disk:\boot\vmlinuz" ' boot-device set-config-string-default + +\ Example default values for a system that boots primarily from JFFS2 on NAND: + +\ " nand:\boot\vmlinuz" ' boot-device set-config-string-default +\ " ro root=mtd0 rootfstype=jffs2 console=ttyS0,115200 console=tty0" +\ ' boot-file set-config-string-default + +0 value ramdisk-adr +0 value /ramdisk + +create screen-info \ See struct screen_info in include/linux/tty.h + 0 c, \ 0 x position + 0 c, \ 1 y position + 0 w, \ 2 plug in memory size here + 0 w, \ 4 video page + 0 c, \ 6 video mode - 7 means monochrome, anything else is color + d# 80 c, \ 7 columns + 0 w, \ 8 unused + 0 w, \ a ega_bx - anything but 0x10 + 0 w, \ c unused + d# 25 c, \ e lines + 0 c, \ f isVGA? + d# 16 w, \ 10 font height +here screen-info - constant /screen-info + + +h# 9.0000 constant linux-params +h# 10.0000 value linux-base +: code16-size ( -- #bytes ) load-base h# 1f1 + c@ 1+ d# 512 * ; +0 value cmdline-offset + +\ Find the end of the largest piece of memory +: memory-limit ( -- limit ) + " /memory" find-package 0= abort" No /memory node" ( phandle ) + " available" rot get-package-property abort" No memory node available property" ( $ ) + \ Find the memory piece that starts at 1 Meg + begin dup 8 >= while ( $ ) + decode-int h# 10.0000 = if ( $ ) \ Found the one we want + decode-int h# 10.0000 + ( $ limit ) + nip nip exit + then ( $ ) + decode-int drop ( $ ) + repeat ( $ ) + 2drop true abort" No suitable memory piece" +; + +d# 20 constant /root-dev-buf +/root-dev-buf buffer: root-dev-buf + +: make-root-dev$ ( idx -- root-dev$ ) + root-dev-buf /root-dev-buf 0 fill + " root=/dev/hda" rot + 1+ base @ >r d# 10 base ! (.) r> base ! + $cat2 + 2dup 2>r root-dev-buf swap move + 2r> free-mem + root-dev-buf /root-dev-buf +; +: +lp ( offset -- adr ) linux-params + ; + +0 [if] +: add-root-dev ( cmdline$ -- cmdline$' ) + 2>r " root=" 2r@ sindex -1 = if + 2r> + " disk:root," $partition-idx dup -1 <> if + make-root-dev$ $cat2 + else + drop + then + else + 2r> + then +; +[else] +: add-root-dev ( cmdline$ -- cmdline$' ) +; +[then] + +: set-parameters ( cmdline$ -- ) + screen-info linux-params /screen-info move \ Ostensibly screen info + + memory-limit ( #bytes ) + d# 1023 invert and d# 1024 / ( #kbytes ) + d# 1024 - h# 002 +lp w! \ Kbytes of extended (not the 1st meg) memory + + memory-limit ( #bytes ) + d# 1023 invert and d# 1024 / ( #kbytes ) + d# 1024 - h# 1e0 +lp l! \ Alternate amount of extended memory + + 0 h# 1f2 +lp w! \ root flags - non0 to mount root read-only + 0 h# 1f8 +lp w! \ Ramdisk flags + +\ 301 for /dev/hda, 100 for /dev/ram0, 0 for nothing (set it from cmdline) +\ h# 301 h# 1fc +lp w! \ root_dev - see init/main.c:parse_root_dev +\ h# 100 h# 1fc +lp w! \ root_dev - see init/main.c:parse_root_dev + h# 0 h# 1fc +lp w! \ root_dev - see init/main.c:parse_root_dev + + 0 h# 1ff +lp c! \ Aux device - set to AA if PS2 mouse present + /ramdisk 0<> h# 210 +lp w! \ loader type - set non0 to enable ramdisk info +\ h# 100000 h# 214 +lp l! \ kernel start - unused + ramdisk-adr h# 218 +lp l! \ initrd start + /ramdisk h# 21c +lp l! \ initrd size + + \ Put Open Firmware signature and IDT pointer in the params area + " OFW " drop @ h# b0 +lp l! \ Validator for this area + 1 h# b4 +lp l! \ Number of additional items (version#) + cif-handler h# b8 +lp l! \ Client interface handler + idt drop h# bc +lp l! \ So Linux can preserve our debug vectors + + \ Command line goes after the 16-bit wad + ( cmdline$ ) add-root-dev + ( cmdline$ ) cmdline-offset +lp swap 1+ move + h# a33f h# 20 +lp w! \ Command line validator (magic number) + cmdline-offset h# 22 +lp w! \ Command line offset + cmdline-offset +lp h# 228 +lp l! \ New command line address +; + +: linux-fixup ( -- ) +[ifdef] linux-logo linux-logo [then] + args-buf cscount set-parameters ( ) + h# ff h# 21 pc! \ Squelch the timer interrupt and others + + linux-base linux-params (init-program) + linux-params to %esi +; + +d# 256 buffer: ramdisk-buf +' ramdisk-buf " ramdisk" chosen-string + +defer load-ramdisk +: $load-ramdisk ( name$ -- ) + 0 to /ramdisk ( name$ ) + + ['] load-path behavior >r ( name$ r: xt ) + ['] ramdisk-buf to load-path ( name$ r: xt ) + + ." Loading ramdisk image from " 2dup type ." ..." ( name$ r: xt ) + ['] boot-read catch ( throw-code r: xt ) + cr ( throw-code r: xt ) + r> to load-path ( throw-code ) + throw + loaded to /ramdisk to ramdisk-adr +; +: cv-load-ramdisk ( -- ) + " ramdisk" eval dup 0= if 2drop exit then ( name$ ) + $load-ramdisk +; +' cv-load-ramdisk to load-ramdisk + +: claim-params ( -- ) +[ifdef] virtual-mode + 0 0 1meg -1 mmu-map ( ) \ Make the parameter area accessible +[then] + 0 +lp h# 1000 0 mem-claim drop \ Play nice with memory reporting + 0 +lp h# 1000 erase +; + +0 value linux-loaded? +: ?linux-elf-map-in ( va size -- ) + \ The Linux startup code really wants the physical address to be + \ virtual_address AND 0x0fff.ffff. We recognize Linux by the virtual + \ address range that it uses (0xc0xx.xxxx) + over h# f000.0000 and h# c000.0000 = if + h# 40.0000 to linux-base + h# 800 to cmdline-offset + true to linux-loaded? + over h# 0fff.ffff and ( va size pa ) + -rot -1 ( pa va size mode ) + mmu-map + exit + then + (elf-map-in) +; +' ?linux-elf-map-in is elf-map-in + +: init-bzimage? ( -- flag ) + loaded ( adr len ) + h# 202 /string ( adr' len' ) + 4 < if drop false exit then ( adr ) + " HdrS" comp if false exit then ( ) + h# 10.0000 to linux-base + code16-size to cmdline-offset \ Save in case we clobber load-base + load-base 0 +lp code16-size move \ Copy the 16-bit stuff + loaded code16-size /string linux-base swap move \ Copy the 32-bit stuff + true to linux-loaded? + true +; + +warning @ warning off +: init-program ( -- ) + init-bzimage? if exit then + init-program +; + +: sym ( "name" -- adr ) + parse-word $sym> 0= if err-sym-not-found throw then +; +warning ! + +warning @ warning off +: init-program ( -- ) + false to linux-loaded? + init-program + linux-loaded? if + claim-params + ['] load-ramdisk guarded + linux-fixup + then +; +warning ! + +: mcr ( -- ) cr exit? throw ; +: help-debug ( -- ) + red-letters + ." Debugging the Linux kernel requires a few patches to keep Linux from" mcr + ." overwriting the firmware debug vector." mcr mcr + black-letters + + ." COMMAND STACK EFFECT DESCRIPTION" mcr + ." .registers ( -- ) Display registers" mcr + ." go ( -- ) Resume execution" mcr + ." step ( -- ) Single-step" mcr + ." ^T ( -- ) (Control-T) Keystroke shortcut for 'step'" mcr + ." steps ( n -- ) Single-step n times" mcr + ." hop ( -- ) Step over subroutine calls" mcr + ." hops ( n -- ) Hop n times" mcr + ." dis ( addr -- ) Disassemble starting at given address" mcr + ." +dis ( -- ) Continue disassembling" mcr + ." bp ( addr -- ) Set breakpoint at given address" mcr + ." till ( addr -- ) Set breakpoint at given address and go" mcr + ." -bp ( addr -- ) Delete breakpoint at given address" mcr + ." --bp ( -- ) Delete last breakpoint" mcr + ." .bp ( -- ) Show breakpoints" mcr + ." return ( -- ) Finish execution of current subroutine" mcr + ." finish-loop ( -- ) Finish execution of current loop" mcr + ." %eax ( -- n ) Push EAX (etc.) register value on stack" mcr + ." %eip ( -- n ) Push EIP register value on stack" mcr + ." %pc ( -- n ) Same as %eip" mcr + ." to %eax ( n -- ) Set EAX (etc.) register value from stack" mcr + ." to %eip ( n -- ) Set EIP register value from stack" mcr + ." sym <name> ( -- n ) Push value of named kernel symbol on stack" mcr + ." .adr ( n -- ) Display symbol name closest to n" mcr + ." Examples: " mcr + ." %pc dis Disassemble starting at program counter" mcr + ." %ebx u. Display saved value of EBX register" mcr + ." step Single step once" mcr + ." 10 hops Step 10 times, don't go down into subroutines" mcr + ." 1234 to %ebp Set EBP register to (hex) 1234" mcr + ." sym kbd_init dis Disassemble starting at kbd_init" mcr + ." sym kbd_init till Set breakpoint at kbd_init and go" mcr + ." %pc 5 + to %pc Add 5 to the program counter register" mcr + + mcr + ." More information: http://firmworks.com/QuickRef.html" cr +; + +d# 34 to default-#lines + +warning @ warning off +: help ( -- ) + blue-letters ." UPDATES:" black-letters mcr + ." flash u:\q2c18.rom Rewrite the firmware from USB key" mcr + ." flash nand:\q2c18.rom Rewrite the firmware from NAND file" mcr + ." copy-nand u:\boot\nand290.img Rewrite the OS on NAND from USB key" mcr + mcr + blue-letters ." DIRECTORY LISTING:" black-letters mcr + ." dir u:\ List USB key root directory" mcr + ." dir u:\boot\ List USB key /boot directory" mcr + ." dir nand:\boot\ List NAND FLASH /boot directory" mcr + ." dir nand:\boot*.rom List .rom files in NAND FLASH /boot directory" mcr + mcr + blue-letters ." BOOTING:" black-letters mcr + ." boot Load the OS from list of default locations" mcr + ." 'printenv boot-device' shows the list" mcr + ." boot <cmdline> Load the OS, passing <cmdline> to kernel" mcr + ." boot u:\boot\vmlinuz Load the OS from a specific location" mcr + mcr + blue-letters ." CONFIGURATION VARIABLES FOR BOOTING:" black-letters mcr + ." boot-device Kernel or boot script path. Example: nand:\boot\olpc.fth" mcr + ." boot-file Default cmdline. Example: console=ttyS0,115200" mcr + ." ramdisk initrd pathname. Example: disk:\boot\initrd.imz" mcr + mcr + blue-letters ." MANAGING CONFIGURATION VARIABLES:" black-letters mcr + ." printenv [ <name> ] Show configuration variables" mcr + ." setenv <name> <value> Set configuration variable" mcr + ." editenv <name> Edit configuration variable" mcr + mcr + blue-letters ." DIAGNOSTICS:" black-letters mcr + ." test <device-name> Test device. Example: test mouse" mcr + ." test-all Test all devices that have test routines" mcr + mcr + ." More information: " + green-letters ." http://wiki.laptop.org/go/OFW_FAQ" black-letters cr +; +warning ! + + +\ 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
Added: cpu/x86/pc/lxdevel/addrs.fth =================================================================== --- cpu/x86/pc/lxdevel/addrs.fth (rev 0) +++ cpu/x86/pc/lxdevel/addrs.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,109 @@ +\ See license at end of file +purpose: Establish address and I/O configuration definitions + +[ifdef] use-meg0 +h# f0.0000 constant dropin-base +h# 08.0000 constant dropin-size +h# 0.4000 constant fw-pa +h# f.c000 constant /fw-ram +[then] + +[ifdef] rom-loaded +[ifdef] lx-devel +h# fff8.0000 constant rom-pa \ Physical address of boot ROM +h# 8.0000 constant /rom \ Size of boot ROM +rom-pa constant dropin-base +[else] +h# fff0.0000 constant rom-pa \ Physical address of boot ROM +h# 10.0000 constant /rom \ Size of boot ROM +rom-pa h# 1.0000 + constant dropin-base +[then] + +h# 8.0000 constant dropin-size + +dropin-base h# 20 + constant ResetBase \ Location of "reset" dropin in ROM + +h# 1c0.0000 constant fw-pa +h# 20.0000 constant /fw-ram +[then] + +[ifdef] linuxbios-loaded +\ h# d8.0000 constant dropin-base +h# fff2.0000 constant dropin-base \ Location of payload in FLASH +\ h# fff8.0000 constant dropin-base \ Location of payload in FLASH +dropin-base h# 80 + h# 20 + constant ResetBase \ Location of "reset" dropin in ROM +h# 08.0000 constant dropin-size +h# 1e0.0000 constant fw-pa +h# 20.0000 constant /fw-ram +h# fff0.0000 constant rom-pa +h# 10.0000 constant /rom +[then] + +[ifdef] old-bzimage-loaded +\ h# d8.0000 constant dropin-base +h# 10.0020 constant dropin-base \ RAM address where Linux normally loads +h# 08.0000 constant dropin-size +h# 20.0000 constant fw-pa +h# 20.0000 constant /fw-ram +[then] + +[ifdef] bzimage-loaded +h# 1d8.0020 constant dropin-base \ RAM address where we want to end up +h# 08.0000 constant dropin-size +h# 1e0.0000 constant fw-pa +h# 20.0000 constant /fw-ram +[then] + +[ifdef] syslinux-loaded +h# 10.1020 constant dropin-base +h# 07.e0e0 constant dropin-size +h# 20.0000 constant fw-pa +h# 20.0000 constant /fw-ram +[then] + +[ifdef] grub-loaded +h# 1b8.0000 constant dropin-base +h# 08.0000 constant dropin-size +h# 1c0.0000 constant fw-pa +h# 20.0000 constant /fw-ram +[then] + +h# 80.0000 constant def-load-base \ Convenient for initrd + +\ The heap starts at RAMtop, which on this system is "fw-pa /fw-ram +" +h# 20.0000 constant heap-size + +h# 300.0000 constant jffs2-dirent-base +h# 500.0000 constant jffs2-inode-base +h# 700.0000 constant dma-base +h# 900.0000 constant dma-size + +h# f.0000 constant suspend-base \ In the DOS hole +h# f.0008 constant resume-entry +h# f.0800 constant resume-data + +fload ${BP}/cpu/x86/pc/virtaddr.fth + +\ 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
Added: cpu/x86/pc/lxdevel/banner.fth =================================================================== --- cpu/x86/pc/lxdevel/banner.fth (rev 0) +++ cpu/x86/pc/lxdevel/banner.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,56 @@ +\ See license at end of file +purpose: Banner customization for this system + +headerless + +: .rom ( -- ) + ." OpenFirmware " + push-decimal + major-release (.) type ." ." minor-release (.) type sub-release type + pop-base +[ifdef] bzimage-loaded + ." booted from disk - " .built +[then] +; + +: (xbanner-basics) ( -- ) + ?spaces cpu-model type ." , " .memory + ?spaces .rom +; +' (xbanner-basics) to banner-basics + +' (banner-warnings) to banner-warnings + +: stop-auto? ( -- flag ) idprom-valid? 0= auto-boot? and ; + +defer gui-banner ' true to gui-banner +: ?gui-banner ( -- ) + stop-auto? if suppress-auto-boot then + + gui-banner drop +; + +headers +\ 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
Modified: cpu/x86/pc/lxdevel/config.fth =================================================================== --- cpu/x86/pc/lxdevel/config.fth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/config.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -1,8 +1,6 @@ \ See license at end of file purpose: Establish configuration definitions
-create olpc-gui \ Use OLPC graphics - create use-lx create lx-devel
@@ -43,7 +41,7 @@
create use-null-nvram
-fload ${BP}/cpu/x86/pc/olpc/addrs.fth +fload ${BP}/cpu/x86/pc/lxdevel/addrs.fth
\ LICENSE_BEGIN \ Copyright (c) 2006 FirmWorks
Modified: cpu/x86/pc/lxdevel/devices.fth =================================================================== --- cpu/x86/pc/lxdevel/devices.fth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/devices.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -1,9 +1,8 @@ \ See license at end of file purpose: Load device drivers according to configuration definitions
-: board-revision ( -- n ) - h# 4c00.0014 rdmsr drop 4 rshift 7 and -; +: gx? ( -- flag ) h# 4c000017 msr@ drop 4 rshift 2 = ; +: lx? ( -- flag ) h# 4c000017 msr@ drop 4 rshift 3 = ;
fload ${BP}/cpu/x86/pc/isaio.fth
@@ -221,12 +220,12 @@ dend ;
-fload ${BP}/cpu/x86/pc/olpc/mfgdata.fth \ Manufacturing data - \ fload ${BP}/dev/geode/lpcflash.fth \ Reflasher for PLCC FLASH on A-test
: +i encode-int encode+ ; : 0+i 0 +i ;
+false config-int tft-mode? + fload ${BP}/cpu/x86/fb16-ops.fth fload ${BP}/ofw/termemu/fb16.fth 0 0 " 1,1" " /pci" begin-package
Modified: cpu/x86/pc/lxdevel/fw.bth =================================================================== --- cpu/x86/pc/lxdevel/fw.bth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/fw.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -83,7 +83,7 @@ alias lmove lmove \ Needed by CS5536 NAND FLASH driver dend
-fload ${BP}/cpu/x86/pc/olpc/gpio.fth \ Rudimentary GPIO driver +fload ${BP}/dev/geode/gpio.fth \ Rudimentary GPIO driver fload ${BP}/cpu/x86/pc/lxdevel/probemem.fth \ Memory probing
[ifdef] virtual-mode @@ -117,12 +117,14 @@ [then]
[ifdef] linux-support +\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation support-package: ext2-file-system fload ${BP}/ofw/fs/ext2fs/ext2fs.fth \ Linux file system end-support-package [then]
[ifdef] jffs2-support +\needs unix-seconds> fload ${BP}/ofw/fs/unixtime.fth \ Unix time calculation support-package: jffs2-file-system fload ${BP}/ofw/fs/jffs2/jffs2.fth \ Journaling flash file system 2 end-support-package @@ -224,7 +226,7 @@ fload ${BP}/cpu/x86/pc/boot.fth
h# 3ea constant usb-port-power-map \ USB4:PWR2 USB3:PWR1 USB2:PWR1 USB1:PWR1 -fload ${BP}/cpu/x86/pc/olpc/usb.fth +fload ${BP}/dev/geode/usb.fth
false to stand-init-debug? \ true to stand-init-debug? @@ -277,33 +279,27 @@ ;
[ifdef] linux-support -fload ${BP}/cpu/x86/pc/olpc/linux.fth +fload ${BP}/cpu/x86/pc/linux.fth +\ Use values like these if you want to boot directly instead of through an intermediate script +\ " disk:\vmlinuz" ' boot-device set-config-string-default +\ " disk:\initrd" d# 128 config-string ramdisk + +\needs ramdisk " " d# 128 config-string ramdisk +" " ' boot-file set-config-string-default \ Let the boot script set the cmdline [then]
+" disk:\boot\boot.fth nand:\boot\boot.fth /prober /usb/ethernet" ' boot-device set-config-string-default + + fload ${BP}/ofw/gui/bmptools.fth fload ${BP}/dev/null.fth fload ${BP}/ofw/core/bailout.fth
-[ifdef] olpc-gui -\ GUI -false value gui-safeboot? +fload ${BP}/cpu/x86/pc/lxdevel/banner.fth
-\ FIXME need to implement user-ok to lockout ok prompt -: 2tuck ( d1 d2 -- d2 d1 d2 ) 2swap 2over ; -false value fru-test? -: user-ok "ok" ; \ This is supposed to check for authorization -true value user-mode? - -fload ${BP}/cpu/x86/pc/olpc/banner.fth -[then] - fload ${BP}/ofw/gui/loadmenu.fth \ fload ${BP}/ofw/gui/insticon.fth
-[ifdef] olpc-gui -fload ${BP}/cpu/x86/pc/olpc/gui.fth -[then] - \ 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. @@ -349,14 +345,6 @@ fload ${BP}/ofw/ppp/loadppp.fth [then]
-[ifdef] pc-linux -" a:\initrd.imz" d# 128 config-string ramdisk -" root=/dev/ram0 mount_ramdisk=1" ' boot-file set-config-string-default -" a:\vmlinuz" ' boot-device set-config-string-default -true ' client-symbols? set-config-int-default -\ Also try " console=/dev/ttyS0,9600 console=/dev/tty0" in boot-file -[then] - " dhcp" ' ip-address set-config-string-default
\ fload ${BP}/cpu/x86/pc/report.fth @@ -492,15 +480,11 @@ quit ;
-fload ${BP}/cpu/x86/pc/olpc/copynand.fth - -[ifndef] olpc \ This sometimes helps with VGA/EGA boards, enabling I/O space access \ to the CRT registers that control the hardware cursor. : cursor ( -- ) " begin-select /display 3 my-space 4 + config-w! unselect" evaluate ; -[then]
\ This helps with TeraTerm, which sends ESC-O as the arrow key prefix also hidden also keys-forth definitions
Added: cpu/x86/pc/lxdevel/loaddropins.fth =================================================================== --- cpu/x86/pc/lxdevel/loaddropins.fth (rev 0) +++ cpu/x86/pc/lxdevel/loaddropins.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,22 @@ +\ Loads the set of drivers that is common to different output formats + + " paging.di" $add-file + " ${BP}/cpu/x86/build/inflate.bin" " inflate" $add-dropin + " fw.img" " firmware" $add-deflated-dropin + + " ${BP}/dev/usb2/hcd/ohci/build/ohci.fc" " class0c0310" $add-deflated-dropin + " ${BP}/dev/usb2/hcd/ehci/build/ehci.fc" " class0c0320" $add-deflated-dropin + " ${BP}/dev/usb2/device/hub/build/hub.fc" " usb,class9" $add-dropin + " ${BP}/dev/usb2/device/net/build/usbnet.fc" " usbnet" $add-deflated-dropin + " ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc" " usb,class3,1" $add-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 + + " ${BP}/dev/geode/ac97/build/ac97.fc" " pci1022,2093" $add-deflated-dropin + + " builton.fth" " probe-" $add-dropin + " ${BP}/ofw/fcode/memtest.fth" " memtest.fth" $add-deflated-dropin + + " ${BP}/ofw/inet/telnetd.fth" " telnetd" $add-deflated-dropin + + " ${BP}/ofw/termemu/gallant.obf" " font" $add-deflated-dropin
Modified: cpu/x86/pc/lxdevel/lxdevel.bth =================================================================== --- cpu/x86/pc/lxdevel/lxdevel.bth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/lxdevel.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -7,8 +7,6 @@ in: ${BP}/cpu/x86/pc/lxdevel/build/paging.di in: ${BP}/cpu/x86/pc/lxdevel/build/fw.dic in: ${BP}/dev/geode/nandflash/build/nandflash.fc -in: ${BP}/dev/mmc/sdhci/build/sdhci.fc -in: ${BP}/dev/mmc/sdhci/build/sdmmc.fc in: ${BP}/dev/geode/ac97/build/ac97.fc in: ${BP}/dev/usb2/hcd/ohci/build/ohci.fc in: ${BP}/dev/usb2/hcd/ehci/build/ehci.fc @@ -17,11 +15,7 @@ in: ${BP}/dev/usb2/device/serial/build/usbserial.fc in: ${BP}/dev/usb2/device/storage/build/usbstorage.fc in: ${BP}/dev/usb2/device/keyboard/build/usbkbd.fc -in: ${BP}/dev/usb2/device/wlan/build/usb8388.fc -in: ${BP}/dev/olpc/cafenand/build/cafenand.fc -in: ${BP}/dev/olpc/cafecamera/build/cafecamera.fc in: ${BP}/dev/pci/build/pcibridg.fc -in: usb8388.bin
build-now
@@ -48,7 +42,7 @@ " romreset.di" $add-file \ " resume.di" $add-file
- fload ${BP}/cpu/x86/pc/olpc/loaddropins.fth + fload ${BP}/cpu/x86/pc/lxdevel/loaddropins.fth " ${BP}/dev/pci/build/pcibridg.fc" " class060400" $add-deflated-dropin
/rom h# 400 - pad-file \ rmstart image must start 0x400 from end
Modified: cpu/x86/pc/lxdevel/msrinit.fth =================================================================== --- cpu/x86/pc/lxdevel/msrinit.fth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/msrinit.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -193,7 +193,7 @@ msr: 5100.0023 0189c001.01880001. \ IRQ mapper msr: 5100.0024 0147c001.01400001. \ PMS msr: 5100.0025 0187c001.01840001. \ ACPI - msr: 5100.0026 014fc001.01480001. \ What?? 128 bytes (0x80) + msr: 5100.0026 014fc001.01480001. \ AC97 msr: 5100.0027 fe01a000.fe01a001. \ OHCI msr: 5100.0028 fe01b000.fe01b001. \ EHCI msr: 5100.0029 efc00000.efc00001. \ UOC
Modified: cpu/x86/pc/lxdevel/pcinode.fth =================================================================== --- cpu/x86/pc/lxdevel/pcinode.fth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/pcinode.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -9,6 +9,7 @@ patch nonvirtual-probe-state? probe-state? map-in
\ patch noop assign-all-addresses prober +warning @ warning off : assign-pci-addr ( phys.lo phys.mid phys.hi len | -1 -- phys.hi paddr size ) 2dup -1 <> swap virtual-pci-slot? and if ( phys.lo phys.mid phys.hi len ) 2swap 2drop >r ( phys.hi r: len ) @@ -17,6 +18,7 @@ then assign-pci-addr ; +warning !
: ?clear-addresses ( -- ) my-space virtual-pci-slot? if exit then clear-addresses
Modified: cpu/x86/pc/lxdevel/rmstart.bth =================================================================== --- cpu/x86/pc/lxdevel/rmstart.bth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/rmstart.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -8,4 +8,4 @@ \ create debug-reset
fload ${BP}/cpu/x86/pc/lxdevel/config.fth -fload ${BP}/cpu/x86/pc/olpc/rmstart.fth +fload ${BP}/cpu/x86/pc/lxdevel/rmstart.fth
Added: cpu/x86/pc/lxdevel/rmstart.fth =================================================================== --- cpu/x86/pc/lxdevel/rmstart.fth (rev 0) +++ cpu/x86/pc/lxdevel/rmstart.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,277 @@ +\ See license at end of file +purpose: x86 real mode startup code. + +command: &native &this +build-now + +\ 386/486 processors begin executing at address ffff.fff0 in real mode +\ when they come out of reset. Normally, that address would not be +\ accessable in real mode, but the processor does some magic things to +\ the Code Segment register so that the high order address lines are +\ "boosted" up to the ffff.xxxx range just after reset. The "boosting" +\ persists until the CS register is modified (i.e. with a far jump). + +\ The other segment register are not "boosted", so they can only access +\ the normal real mode range, essentially just the first megabyte. + +\ The startup code must establish a Global Descriptor Table containing +\ suitable mappings, and then enter protected mode. The space between +\ ffff.fff0 and the end of the ROM is insufficient to do this, so the +\ first few instructions must jump elsewhere, to a place where there +\ is enough room. + +\ The code below is rather tricky, especially since the Forth assembler +\ always assumes 32-bit operand size and 32-bit addressing modes. +\ The code is executing in 16-bit mode, so the assembler must be used +\ carefully to ensure generation of the correct opcodes, and override +\ prefixes where necessary. + + +\needs start-assembling fload ${BP}/cpu/x86/asmtools.fth +\needs write-dropin fload ${BP}/forth/lib/mkdropin.fth + +hex + +start-assembling +protected-mode +hex + +\ Addresses where the following items will be located in the processor's +\ physical address space: + +\ ffff.fc00: GDT ( 3 entries ) + padding +\ ffff.fc20: GDT address + size ( 6 bytes ) plus padding +\ ffff.fc28: Startup code plus padding +\ ffff.fff0: Reset entry point - jump to startup code plus padding to end + +\ Assembler macros for startup diagnostics + +\ write a byte to an ISA port +: risa-c! ( n a - ) " # dx mov # al mov al dx out " evaluate ; + +: num>asc ( al: b -- al: low ah: hi ) + " al ah mov " evaluate + " h# f # al and " evaluate + " h# 9 # al cmp > if h# 57 # al add else h# 30 # al add then " evaluate + + " ah shr ah shr ah shr ah shr " evaluate \ shift down four bits + " h# f # ah and " evaluate + " h# 9 # ah cmp > if h# 57 # ah add else h# 30 # ah add then " evaluate + + " al bl mov ah al mov bl ah mov " evaluate + +; + +[ifdef] debug-reset +.( debug reports enabled ) cr +\ Assembler macro to assemble code to send the character "char" to COM1 +: report ( char -- ) + " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate + ( char ) " # al mov 3f8 # dx mov al dx out " evaluate + " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate +; +\ Put character in al +: reportc + " al ah mov " eval + " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate + ( char ) " ah al mov 3f8 # dx mov al dx out " evaluate + " begin 3fd # dx mov dx al in 20 # al and 0<> until" evaluate +; +: init-com1 ( -- ) + 1 3fc risa-c! \ DTR on + 80 3fb risa-c! \ Switch to bank 1 to program baud rate + 01 3f8 risa-c! \ Baud rate divisor low - 115200 baud + 0 3f9 risa-c! \ Baud rate divisor high - 115200 baud + 3 3fb risa-c! \ 8 bits, no parity, switch to bank 0 +; + +[else] +: report ( char -- ) drop ; +: reportc ( -- ) ; +[then] + +hex + +\ odds for testing, evens for release +d# 8 constant loader-version# \ monotonic +2 constant loader-format# \ >1 when crc present + +.( ROM loader: version# ) loader-version# .d +.( , format# ) loader-format# .d cr + +\ Real Mode Startup + +hex + +label rm-startup \ Executes in real mode with 16-bit operand forms + + \ ffff.fc00 GDT + + 0 w, 0 l, 0 w, \ 0 Mandatory null descriptor + 0 w, 0 l, 0 w, \ * Another null descriptor + ffff w, 9b.000000 l, 00.c.f w, \ 10 Code, linear=physical, full 4Gbytes + ffff w, 93.000000 l, 00.c.f w, \ 18 Data, linear=physical, full 4Gbytes + + \ ffff.fc20 GDT limit + address + + 1f w, ffff.fc00 l, \ # slots (4 * 8 - 1) , starting address + 0 w, \ Padding + + \ ------->>>>> Startup code, reached by branch from main entry point below + \ + \ ffff.fc28 + + here \ Mark the beginning of this code so its size may be determined + \ and so that a jump to it may be assembled later. + + real-mode + + h# 01 # al mov al h# 80 # out + + \ This code is highly optimized because it runs when the CPU is in + \ it slowest operation mode, so we want to get it done fast. + \ GLCP_SYS_RSTPLL - page 406 + \ If the PLL is already set up, we don't redo the 5536 setup + op: h# 4c000014 # cx mov rdmsr \ MSR value in dx,ax + al bl mov + op: h# fc00.0000 # ax and 0= if \ Start the PLL if not already on + rdmsr \ Get base MSR value with divisors + op: h# 04de.0000 # ax or \ Set the startup time (de) and breadcrumb (4) + op: h# 0000.04d9 # dx mov \ PLL value for 333 MB clk, 433 CPU + wrmsr \ Put in the base value + op: h# 0000.1800 invert # ax and \ Turn off the BYPASS bits + + h# 6001 # ax or \ Set PD, RESETPLL + wrmsr \ Start the PLL and reset the CPU + then + + \ Return to here after the reset + h# 02 # al mov al h# 80 # out + + +[ifdef] init-com1 init-com1 [then] + +[ifdef] debug-reset +carret report \ send it to com1 if you can... +linefeed report \ send it to com1 if you can... +ascii F report \ send it to com1 if you can... +[then] + + \ The following instruction uses the CS: segment override because + \ that segment is currently "boosted" up into the ROM space. + \ It uses the operation size override to load a 32-bit pointer. + \ The address override is not used; the GDT limit/address data structure + \ above is reachable with a 16-bit address and through the "boosted" + \ code segment. + + op: cs: 0f c, 01 c, 16 c, fc20 w, \ lgdte cs:[fc20] Setup GDT + + op: cr0 bx mov \ Get existing CR0 value + + 1 # bl or \ Set "protected mode" bit + + bx cr0 mov \ Enter protected mode + eb c, 0 c, \ jmp to next location to flush prefetch queue + \ note: CPL is now 0 + + h# 03 # al mov al h# 80 # out + + \ We are in protected mode, but we are still executing from old + \ 16-bit code segment, and will continue to do so until the far jump + \ below + +[ifdef] debug-reset +ascii o report +[then] + + \ set segment registers + bx bx xor \ Clear high byte + 18 # bl mov \ Data segment selector + bx ds mov \ Set segment register + bx es mov \ Set segment register + bx fs mov \ Set segment register + bx gs mov \ Set segment register + +[ifdef] debug-reset +ascii r report +[then] + + bx ss mov \ Set segment register + +[ifdef] debug-reset +ascii t report +ascii h report +[then] + + h# 0f # al mov al h# 80 # out + + op: h# 1430 # dx mov op: dx ax in op: h# 9999 # ax cmp = if + h# 34 # al mov al h# 70 # out \ Write to CMOS 0x34 + h# 0f # al mov al h# 71 # out \ Write value 01 + then + + op: ad: ResetBase h# 10 #) far jmp \ Jump to Forth startup + + real-mode + + \ Pad the startup code so that the main entry point ends up at the + \ correct address. + + here over - ( adr , size-of-preceding-code ) + + \ ffff.fc28 is the location of the code that follows the GDT + ffff.fff0 ffff.fc28 - swap - ( address #bytes-to-pad ) + + \ The code mustn't extend past ffff.ffc0, because that is where PC + \ manufacturers put the 0x10-byte BIOS version string. + dup h# 30 - also forth 0< previous abort" Real mode startup code is too big" + + also forth here over h# ff fill previous \ fill with FFs + ( #bytes-to-pad ) allot \ Pad out to ffff.fff0 + + \ ------->>>>> Main Entry Point + \ + \ ffff.fff0 - This is the hardwired address where the processor jumps + \ when it comes out of reset + + cli cld \ Turn off interrupts (does not affect NMI) + #) jmp \ Relative jump back to ffff.fc28 + 0 w, 0 c, \ align "pad" to end of ROM + loader-version# l, \ version# + loader-format# w, \ "format" (>1 when crc present) + ffff w, \ placeholder for crc + +end-code + +end-assembling + +writing rmstart.img +rm-startup here over - ofd @ fputs +ofd @ fclose + +here rm-startup - constant /rm-startup +/rm-startup h# 400 <> abort" Real mode startup code is not the right size" + +\ 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
Modified: cpu/x86/pc/lxdevel/romreset.bth =================================================================== --- cpu/x86/pc/lxdevel/romreset.bth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/romreset.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -17,7 +17,7 @@ \ startmacros.fth defines some assembler macros that make MSR and I/O port \ access very easy by hiding the details of register use.
-fload ${BP}/cpu/x86/pc/olpc/startmacros.fth +fload ${BP}/dev/geode/startmacros.fth
hex
@@ -62,6 +62,9 @@ \ setup CPU interface serial to mode C on both sides 44000020.00200013. 51000010 set-msr \ 5536 p 229
+ \ Set up GPIO base register + 0000f001.00001000. 5140000c set-msr \ GPIO BAR + \ Init UART \ uart_init,serial.c \ This is a garden-variety 8250 UART setup sequence @@ -123,8 +126,17 @@ \ char b 3f8 port-wb begin 3fd port-rb 40 bitand 0<> until h# 12 # al mov al h# 80 # out
-fload ${BP}/cpu/x86/pc/olpc/draminit.fth +fload ${BP}/dev/geode/draminit.fth
+ \ Last-minute check for LX erratum 34 - reset if the DLL didn't start correctly + h# 4c000017 rmsr h# 10 bitand 0<> if \ LX branch + h# 4c00000f rmsr h# 7ff bitclr h# 4 bitset h# 4c00000f wmsr \ Set DLL_OV + h# 4c00000f rmsr h# 7ff # ax and h# 104 # ax cmp = if \ Check the result + \ The value 104 indicates that the DLL did not start, so we must reset + 1. 5140.0017 set-msr + then + then + \ Now we can use the stack and do conventional subroutine calls
h# 1f # al mov al h# 80 # out
Modified: cpu/x86/pc/lxdevel/versions.fth =================================================================== --- cpu/x86/pc/lxdevel/versions.fth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/lxdevel/versions.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -3,11 +3,3 @@ \ The overall firmware revision macro: FW_MAJOR C macro: FW_MINOR 02 - -\ The EC microcode -macro: EC_VERSION b87 - -\ The wireless LAN module firmware -macro: WLAN_RPM 5.220.10.p5-1.olpc1 -macro: WLAN_VERSION 5.220.10.p5 -macro: WLAN_DATE 2007-03-30
Added: cpu/x86/pc/memtest.fth =================================================================== --- cpu/x86/pc/memtest.fth (rev 0) +++ cpu/x86/pc/memtest.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,41 @@ +purpose: Interface to memtest86 + +: ?memtest-elf-map-in ( vaddr size -- ) + \ We recognize memtest by its virtual address of 0x10000 + \ It expects that virtual = physical; we depend on the fact + \ that we have low memory mapped V=P + over h# 10000 = if ( vaddr size ) + \ Map the frame buffer (virtual=physical) + h# 910 config-l@ dup 100.0000 -1 mmu-map + then + + \ If it's not memtest, chain to the linux recognizer + ?linux-elf-map-in +; +' ?memtest-elf-map-in is elf-map-in + +: memtest ( -- ) " rom:memtest" $boot ; + +\ LICENSE_BEGIN +\ Copyright (c) 2008 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
Modified: cpu/x86/pc/olpc/fw.bth =================================================================== --- cpu/x86/pc/olpc/fw.bth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/olpc/fw.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -104,7 +104,7 @@ ; [then]
-fload ${BP}/cpu/x86/pc/olpc/gpio.fth \ Rudimentary GPIO driver +fload ${BP}/dev/geode/gpio.fth \ Rudimentary GPIO driver fload ${BP}/cpu/x86/pc/olpc/probemem.fth \ Memory probing
[ifdef] virtual-mode @@ -244,7 +244,7 @@ h# 3aa \ USB4:PWR1 USB3:PWR1 USB2:PWR1 USB1:PWR1 then ; -fload ${BP}/cpu/x86/pc/olpc/usb.fth +fload ${BP}/dev/geode/usb.fth
\ false to stand-init-debug? true to stand-init-debug? @@ -336,7 +336,8 @@ fload ${BP}/cpu/x86/pc/olpc/crypto.fth \ Cryptographic image validation fload ${BP}/cpu/x86/pc/olpc/lzip.fth \ Access zip images from memory fload ${BP}/cpu/x86/pc/olpc/gamekeys.fth -fload ${BP}/cpu/x86/pc/olpc/linux.fth +fload ${BP}/cpu/x86/pc/linux.fth +fload ${BP}/cpu/x86/pc/memtest.fth fload ${BP}/cpu/x86/pc/olpc/setwp.fth fload ${BP}/cpu/x86/pc/olpc/security.fth fload ${BP}/cpu/x86/pc/olpc/fsupdate.fth @@ -350,6 +351,13 @@ ' gx-power-off to power-off [then]
+" disk:\boot\olpc.fth sd:\boot\olpc.fth nand:\boot\olpc.fth /prober /usb/ethernet /usb/wlan" + ' 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 + + : dimmer ( -- ) screen-ih if " dimmer" screen-ih $call-method then ; : brighter ( -- ) screen-ih if " brighter" screen-ih $call-method then ;
Modified: cpu/x86/pc/olpc/romreset.bth =================================================================== --- cpu/x86/pc/olpc/romreset.bth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/olpc/romreset.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -17,7 +17,7 @@ \ startmacros.fth defines some assembler macros that make MSR and I/O port \ access very easy by hiding the details of register use.
-fload ${BP}/cpu/x86/pc/olpc/startmacros.fth +fload ${BP}/dev/geode/startmacros.fth
hex
@@ -346,7 +346,7 @@ h# 12 # al mov al h# 71 # out \ Write value 01 then
-fload ${BP}/cpu/x86/pc/olpc/draminit.fth +fload ${BP}/dev/geode/draminit.fth
\ Last-minute check for LX erratum 34 - reset if the DLL didn't start correctly h# 4c000017 rmsr h# 10 bitand 0<> if \ LX branch
Modified: cpu/x86/pc/olpc/versions.fth =================================================================== --- cpu/x86/pc/olpc/versions.fth 2008-05-21 21:05:04 UTC (rev 823) +++ cpu/x86/pc/olpc/versions.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -2,7 +2,7 @@
\ The overall firmware revision macro: FW_MAJOR D -macro: FW_MINOR 14 +macro: FW_MINOR 14b
\ The EC microcode macro: EC_VERSION d13
Added: dev/geode/draminit.fth =================================================================== --- dev/geode/draminit.fth (rev 0) +++ dev/geode/draminit.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,117 @@ + h# 18 # al mov al h# 80 # out + h# 1430 # dx mov dx ax in h# 9999 # ax cmp = if + h# 34 # al mov al h# 70 # out \ Write to CMOS 0x34 + h# 18 # al mov al h# 71 # out \ Write value 01 + then + + \ Enable DLL, load Extended Mode Register by set and clear PROG_DRAM + 20000018 rmsr + 10000001 bitset 20000018 wmsr + 10000001 bitclr 20000018 wmsr + + \ Reset DLL (bit 27 is undocumented in GX datasheet, but is in the LX one) + 08000001 bitset 20000018 wmsr + 08000001 bitclr 20000018 wmsr + + \ Here we are supposed to wait 200 SDCLK cycles to let the DLL settle. + \ That is approximately 2 uS. The ROM instruction access is so slow that + \ anything we do will take quite a bit longer than that, so we just let the + \ "rmsr, bitset" sequence take care of the time delay for us. + + \ In the following sequence of writes the 2000.0018 MSR, we + \ take advantage of the fact that the existing value stays + \ in EAX/EDX, so we don't have to re-read the value. + + \ Generate 2 refresh requests. The refresh queue is 8 deep, and we + \ need to make sure 2 refreshes hit the chips, so we have to issue + \ 10 requests to the queue. According to the GX datasheet, we don't + \ have to clear the REF_TST bit (8) explicitly between writes + 20000018 rmsr 8 bitset + wrmsr wrmsr wrmsr wrmsr wrmsr wrmsr wrmsr wrmsr wrmsr wrmsr + 8 bitclr + +\ LinuxBIOS LX raminit.c has a big delay here, using Port 61 + + \ Load Mode Register + 1 bitset 20000018 wmsr + 1 bitclr 20000018 wmsr + + \ Set up a descriptor to give access to memory + \ GLIU0 P2D Base Mask Descriptors - page 85 + 20000000.000fff00. 10000020 set-msr \ memory - 0..fffff + + \ The RAM DLL needs a write to lock on + ax h# ffff0 #) mov + + h# 19 # al mov al h# 80 # out + h# 1430 # dx mov dx ax in h# 9999 # ax cmp = if + h# 34 # al mov al h# 70 # out \ Write to CMOS 0x34 + h# 19 # al mov al h# 71 # out \ Write value 01 + then + + \ Turn on the cache + cr0 ax mov + 6000.0000 bitclr \ Cache-disable off, coherent + ax cr0 mov + invd + + h# 1a # al mov al h# 80 # out + h# 1430 # dx mov dx ax in h# 9999 # ax cmp = if + h# 34 # al mov al h# 70 # out \ Write to CMOS 0x34 + h# 1a # al mov al h# 71 # out \ Write value 01 + then + + 0000f001.00001400. 5140000f set-msr \ PMS BAR + + \ It is tempting to test bit 0 of PM register 5c, but a 5536 erratum + \ prevents that bit from working. Bit 1 works, but LX errata 34 + \ sometimes requires that we reset the system to fix the memory DLL, + \ which destroys all the bits of PM register 5c. So we put a breadcrumb + \ in a PM register that we don't otherwise use. + 1430 port-rl h# 9999 # ax cmp = if \ Wakeup event flag + 0 1430 port-wl + h# 1b # al mov al h# 80 # out + h# 34 # al mov al h# 70 # out \ Write to CMOS 0x34 + h# 1b # al mov al h# 71 # out \ Write value 01 + + char r 3f8 port-wb begin 3fd port-rb 40 bitand 0<> until + + resume-data # sp mov + resume-entry # ax mov ax call \ This might return if checksumming fails + char x 3f8 port-wb begin 3fd port-rb 40 bitand 0<> until + then + + h# 1c # al mov al h# 80 # out + h# 1808 rmsr \ Default region configuration properties MSR + h# 0fffff00 # ax and \ Top of System Memory field + 4 # ax shl \ Shift into place + ax mem-info-pa 4 + #) mov \ Put it where resetend.fth can find it + + \ char D 3f8 port-wb begin 3fd port-rb 40 bitand 0<> until + + \ Memory is now on + h# 8.0000 # sp mov \ Setup a stack pointer for later code + + h# 1d # al mov al h# 80 # out +\ Some optional debugging stuff ... +[ifdef] debug-startup +init-com1 + +carret report +linefeed report +ascii F report +ascii o report +ascii r report +[then] + +\ fload ${BP}/cpu/x86/pc/ramtest.fth + +0 [if] +ax ax xor +h# 12345678 # bx mov +bx 0 [ax] mov +h# 5555aaaa # 4 [ax] mov +0 [ax] dx mov +dx bx cmp <> if ascii B report ascii A report ascii D report begin again then +[then] +
Added: dev/geode/gpio.fth =================================================================== --- dev/geode/gpio.fth (rev 0) +++ dev/geode/gpio.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,61 @@ +\ See license at end of file +purpose: Access to GPIO registers + +\ GPIO registers +h# 00 constant OUT_VAL +h# 04 constant OUT_EN +h# 08 constant OUT_OD_EN +h# 0c constant OUT_INVRT_EN +h# 10 constant OUT_AUX1 +h# 14 constant OUT_AUX2 +h# 18 constant PU_EN +h# 1c constant PD_EN +h# 20 constant IN_EN +h# 24 constant INV_EN +h# 28 constant IN_FLTR_EN +h# 2c constant EVNTCNT_EN +h# 30 constant READ_BACK +h# 38 constant EVNT_EN + +h# 1000 value gpio-base \ stand-init sets this from an MSR +: gpio@ ( offset -- 0 ) gpio-base + pl@ ; +: gpio! ( l offset -- ) gpio-base + pl! ; + +alias >set noop ( mask -- mask' ) +: >clr ( mask -- mask' ) d# 16 lshift ; + +: >hi ( reg# -- reg#' ) h# 80 + ; \ High bank for GPIO bits 16..31 + +: gpio-data@ ( -- l ) h# 30 gpio@ ; + + +h# 5140000C constant MSR_LBAR_GPIO + +stand-init: gpio + MSR_LBAR_GPIO rdmsr ( lo hi ) + h# 0000f001 <> abort" GPIO not enabled" + h# ff00 and to gpio-base +; +\ 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
Modified: dev/geode/nandflash/methods.fth =================================================================== --- dev/geode/nandflash/methods.fth 2008-05-21 21:05:04 UTC (rev 823) +++ dev/geode/nandflash/methods.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -10,6 +10,27 @@
external
+: dma-alloc ( len -- adr ) " dma-alloc" $call-parent ; + +: dma-free ( adr len -- ) " dma-free" $call-parent ; + +: close ( -- ) ; + +: size ( -- d ) partition-size /page um* ; + +: $set-partition ( $ -- error? ) + dup 0= if 2drop false exit then ( $ ) + over c@ ascii 0 ascii 9 between if ( $ ) \ number + base @ >r decimal $number r> base ! if true exit then ( ) + set-partition-number ( error? ) + else ( $ ) \ name + set-partition-name ( error? ) + then ( error? ) + dup if ( error? ) + ." NAND: No such partition" cr ( error? ) + then +; + : open ( -- okay? ) \ We assume that LinuxBIOS has already set up the address map \ and the timing MSRs. @@ -17,40 +38,34 @@
h# 51400010 msr@ drop h# 1000 " map-in" $call-parent to nand-base
+ 0 to partition# + 0 to partition-start configure 0= if false exit then
get-bbt + usable-page-limit to partition-size + read-partmap
my-args dup if ( arg$ ) ascii , left-parse-string ( arg2$ arg1$ ) - 2dup " zip" $= if ( arg2$ arg1$ ) - 2drop ( arg2$ ) - map-reserved ( arg2$ ) - init-deblocker 0= if 2drop ?free-resmap false exit then ( arg2$ )
- \ If no file is specified, open the raw archive - dup 0= if 2drop true exit then ( arg2$ ) - - \ Otherwise interpose the filesystem handler - " zip-file-system" find-package if ( arg2$ xt ) - interpose true ( true ) - else ( arg2$ ) - ." Can't find zip-file-system package" cr ( arg2$ ) - 2drop deblocker close-package ?free-resmap ( ) - false ( false ) - then - exit - then ( arg2$ arg1$ ) - - \ Accept either "path" or "jffs2,path" - 2dup " jffs2" $= if ( arg2$ arg1$ ) - 2drop ( arg2$ ) + \ Handle partitions ( arg2$ arg1$ ) + 2dup 1 min " " $= if ( arg2$ arg1$ ) + 2swap 2drop ( arg1$ ) + \ If there is no "mtd" specifier and there is a partition map, + \ select the boot partition. + #partitions 0>= if ( arg1$ ) + " boot" $set-partition if 2drop false exit then + then ( arg2$ arg1$ ) else ( arg2$ arg1$ ) - \ XXX probably should check that arg$2 is empty... - 2swap 2drop ( arg1$ ) - then ( arg$ ) + \ The argument is not a file so it must be a partition spec + #partitions 0< if 2drop 2drop false exit then ( arg2$ arg1$ ) + $set-partition if 2drop false exit then ( arg2$ ) + then ( arg$ )
- " jffs2-file-system" find-package if ( arg$ xt ) + dup 0= if 2drop true exit then ( arg$ ) + + " jffs2-file-system" find-package if ( arg$ xt ) interpose true ( okay? ) else ( arg$ ) ." Can't find jffs2-file-system package" cr @@ -60,14 +75,7 @@ 2drop true ( okay? ) then ( okay? ) ; -: close ( -- ) ?free-resmap ;
-: size ( -- d ) pages/chip /page um* ; - -: dma-alloc ( len -- adr ) " dma-alloc" $call-parent ; - -: dma-free ( adr len -- ) " dma-free" $call-parent ; - headers
[then]
Modified: dev/geode/nandflash/nand5536.fth =================================================================== --- dev/geode/nandflash/nand5536.fth 2008-05-21 21:05:04 UTC (rev 823) +++ dev/geode/nandflash/nand5536.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -42,8 +42,12 @@ : data ( -- ) 0 h# 800 nand! ; : wait-ready ( -- ) data begin h# 810 nand@ 8 and until ;
+0 instance value partition# +0 instance value partition-start \ Boundary between chip 0 and chip 1 +0 instance value partition-size \ Boundary between chip 0 and chip 1 +0 instance value usable-page-limit \ #pages excluding bad block tables
-: page-adr ( page# -- ) dup adr 8 rshift dup adr 8 rshift adr ; +: page-adr ( page# -- ) partition-start + dup adr 8 rshift dup adr 8 rshift adr ; : start-io ( page# offset cmd -- ) cmd ( page# offset ) wbsplit swap adr adr ( page# )
Modified: dev/geode/nandflash/nandflash.bth =================================================================== --- dev/geode/nandflash/nandflash.bth 2008-05-21 21:05:04 UTC (rev 823) +++ dev/geode/nandflash/nandflash.bth 2008-05-21 21:12:54 UTC (rev 824) @@ -12,6 +12,7 @@ fload ${BP}/dev/geode/nandflash/nand5536.fth fload ${BP}/dev/olpc/cafenand/configure.fth fload ${BP}/dev/olpc/cafenand/badblock.fth +fload ${BP}/dev/olpc/cafenand/redboot.fth fload ${BP}/dev/geode/nandflash/methods.fth
end0
Added: dev/geode/startmacros.fth =================================================================== --- dev/geode/startmacros.fth (rev 0) +++ dev/geode/startmacros.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,131 @@ +\ See license at end of file + +\ Some x86 assembler macros for writing Geode early startup code +\ in a clean, compact way. Most of the Geode initialization is +\ done with 64-bit MSRs (Machine Specific Registers). These +\ macros make it easy to set MSRs to specific values and to +\ set and clear individual bits. + +\ The code keeps the MSR register number in %ecx, the low 32 bits +\ of the value in %eax, and the high 32 bits in %edx, consistent +\ with the way the rdmsr and wrmsr machine instructions work. +\ The bitset and bitclr operations work on %eax, and the -hi versions +\ work on %edx. +\ In addition to the MSR operations, there are similar ones for +\ I/O ports. They leave the data in %eax, so you can use bitset +\ and bitclr with them too. + +-1 value last-cx +also 386-assembler definitions + +: forget-msr -1 to last-cx ; + +\ set-cx is an internal implementation factor used by wmsr and rmsr. +\ It assembles code to put an MSR number in %ecx, optimizing out +\ unnecessary code by remembering what was last put there. +: set-cx ( reg# -- ) + [ also forth ] + dup last-cx = if + drop + else + dup to last-cx + [ previous ] # cx mov [ also forth ] + then + [ previous ] +; + +\ Read/write an MSR to/from %edx,%eax +: rmsr ( reg# -- ) set-cx h# 0f c, h# 32 c, ; +: wmsr ( reg# -- ) set-cx h# 0f c, h# 30 c, ; + +\ These bit operations can be used between "rmsr" and "wmsr" + +\ Bit operations on the low 32-bit value in %eax +: bitset ( mask -- ) # ax or ; +: bitand ( mask -- ) # ax and ; +: bitclr ( mask -- ) invert bitand ; + +\ Bit operations on the high 32-bit value in %edx +: bitset-hi ( mask -- ) # dx or ; +: bitand-hi ( mask -- ) # dx and ; +: bitclr-hi ( mask -- ) invert bitand-hi ; + +\ Set an MSR to a verbatim 64-bit value +: set-msr ( d.val reg# -- ) -rot # dx mov # ax mov wmsr ; + +\ Set or clear bits in an MSR (read-modify-write the register) +: bitset-msr ( mask reg# -- ) tuck rmsr bitset wmsr ; +: bitclr-msr ( mask reg# -- ) tuck rmsr bitclr wmsr ; + +\ Some I/O port operations +\ These could be optimized to generate the immediate forms of in and out +\ for 8-bit port numbers, but it's not worth the trouble because we +\ access very few low-numbered ports. +: port-wb ( b port# -- ) swap # al mov # dx mov al dx out ; +: port-rb ( port# -- ) # dx mov dx al in ; +: port-ww ( w port# -- ) swap # ax mov # dx mov op: ax dx out ; +: port-rw ( port# -- ) ax ax xor # dx mov op: dx ax in ; +: port-wl ( l port# -- ) swap # ax mov # dx mov ax dx out ; +: port-rl ( port# -- ) # dx mov dx ax in ; + +: config-setup ( config-adr -- ) + [ also forth ] + dup 3 invert and h# 8000.0000 or ( config-adr cf8-value ) + [ previous ] + # ax mov ( config-adr ) + h# cf8 # dx mov ( config-adr ) + ax dx out ( config-adr ) + [ also forth ] + 3 and h# cfc or ( data-port ) + [ previous ] + # dx mov +; +: config-wl ( l config-adr -- ) + config-setup ( l ) + # ax mov + ax dx out +; +: config-rl ( config-adr -- ) \ Returns value in EAX + config-setup + dx ax in +; +: config-ww ( w config-adr -- ) + config-setup ( w ) + op: # ax mov ( ) + op: ax dx out +; +: config-rw ( config-adr -- ) \ Returns value AX + config-setup ( ) + ax ax xor + op: dx ax in +; + +: set-base ( adr -- ) # bx mov ; +: reg-save ( offset -- ) [bx] ax mov ax stos ; +: reg-restore ( offset -- ) ax lods ax swap [bx] mov ; + +previous definitions + +\ 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
Added: dev/geode/usb.fth =================================================================== --- dev/geode/usb.fth (rev 0) +++ dev/geode/usb.fth 2008-05-21 21:12:54 UTC (rev 824) @@ -0,0 +1,156 @@ +purpose: USB elaborations for the OLPC platform +\ See license at end of file + +0 config-int usb-delay \ Milliseconds to wait before set-address + +devalias usb1 /usb@f,4 +devalias usb2 /usb@f,5 +devalias u /usb/disk +devalias net /usb/wlan + +\ If there is a USB ethernet adapter, use it as the default net device. +: report-net ( -- ) + " /usb/ethernet" 2dup find-package if ( name$ phandle ) + drop ( name$ ) + " net" 2swap $devalias ( ) + else ( name$ ) + 2drop ( ) + then +; + +[ifdef] notdef \ We have the graphical penguin +: linux-logo ( -- ) + " penguin.txt" find-drop-in if page type then +; +[then] + +\ Like $show-devs, but ignores pagination keystrokes +: $nopage-show-devs ( nodename$ -- ) + ['] exit? behavior >r ['] false to exit? + $show-devs + r> to exit? +; + +: probe-usb ( -- ) + ." USB2 devices:" cr + " /usb@f,5" open-dev ?dup if close-dev then + " /usb@f,5" $nopage-show-devs + + ." USB1 devices:" cr + " /usb@f,4" open-dev ?dup if close-dev then + " /usb@f,4" $nopage-show-devs + + report-disk + report-net + report-keyboard +; +alias probe-usb2 probe-usb +alias p2 probe-usb2 + +: ?usb-keyboard ( -- ) + " keyboard" expand-alias if ( devspec$ ) + drop " /usb" comp 0= if ( ) + red-letters ." Using USB keyboard." cr black-letters + " keyboard" input + then + then +; + +\ Unlink every node whose phys.hi component matches port +: port-match? ( port -- flag ) + get-unit if drop false exit then + get-encoded-int = +; +: rm-usb-children ( port -- ) + device-context? 0= if drop exit then + also ( port ) + 'child ( port prev ) + first-child begin while ( port prev ) + over port-match? if ( port prev ) + 'peer link@ over link! ( port prev ) \ Disconnect + else ( port prev ) + drop 'peer ( port prev' ) + then ( port prev ) + next-child repeat ( port prev ) + 2drop ( ) + previous definitions +; + +0 value usb-power-done-time + +\ This version assumes that power has been applied already, and +\ all we have to do is wait enough time for the devices to be ready. +: wait-usb-power ( -- ) + begin usb-power-done-time get-msecs - 0<= until ( ) +; + +: usb-quiet ( -- ) + [ ' go-hook behavior compile, ] \ Chain to old behavior + " usb1" " reset-usb" execute-device-method drop + " usb2" " reset-usb" execute-device-method drop +; +' usb-quiet to go-hook + +0 0 " " " /" begin-package + " prober" device-name + : open + " /usb@f,5" open-dev ?dup if close-dev then + " /usb@f,4" open-dev ?dup if close-dev then + report-disk + report-net + report-keyboard + false + ; + : close ; +end-package + +stand-init: USB setup + \ Set up an address routing to the USB Option Controller + h# efc00000.efc00001. h# 5100.0029 wrmsr + h# 400000ef.c00fffff. h# 5101.0020 wrmsr + h# 00000002.efc00000. h# 5120.000b wrmsr +[ifdef] virtual-mode + h# efc00000 h# 1000 0 mmu-claim drop \ UOC + h# efc00000 dup h# 1000 -1 mmu-map \ UOC + h# fe01a000 h# 1000 0 mmu-claim drop \ OHCI + h# fe01a000 dup h# 1000 -1 mmu-map \ OHCI +[then] + \ Configure the assignment of 2 USB Power Enable pins to USB ports + \ to correspond to the way they are wired on the board. + \ USB port 1 is PWR_EN2, USB ports 2-4 are PWR_EN1 + usb-port-power-map h# efc00000 l! + 2 h# efc00004 l! + h# 1 h# fe01a008 l! \ Reset OHCI host controller + h# 1e.0000 h# fe01a04c l! \ Configure ports for individual power + h# 100 h# fe01a058 l! \ Power-on ports 2 and 3 + d# 10 ms \ Stagger for glitch-prevention + h# 100 h# fe01a054 l! \ Power-on port 1 + h# 100 h# fe01a05c l! \ Power-on port 3 + h# 100 h# fe01a060 l! \ Power-on port 4 + get-msecs d# 1000 + to usb-power-done-time +; + + +\ LICENSE_BEGIN +\ Copyright (c) 2007 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