Author: wmb Date: 2009-04-29 07:55:31 +0200 (Wed, 29 Apr 2009) New Revision: 1159
Added: cpu/x86/acpitimer.fth Modified: cpu/x86/pc/olpc/via/addrs.fth cpu/x86/pc/olpc/via/config.fth cpu/x86/pc/olpc/via/devices.fth cpu/x86/pc/olpc/via/fw.bth cpu/x86/pc/olpc/via/pcinode.fth cpu/x86/pc/olpc/via/romreset.bth dev/mmc/sdhci/sdhci.fth dev/pcibus.fth Log: Via demo version - various improvements, still a work in progress.
Added: cpu/x86/acpitimer.fth =================================================================== --- cpu/x86/acpitimer.fth (rev 0) +++ cpu/x86/acpitimer.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -0,0 +1,62 @@ +\ See license at end of file +purpose: Timing functions using the ACPI timer + +\ The ACPI timer counts at 3.579545 MHz. +\ 3.579545 * 1024 is 3665 +: acpi-timer@ ( -- counts ) acpi-io-base 8 + pl@ ; +: acpi-us ( us -- ) + d# 3664 * d# 10 rshift acpi-timer@ + ( end ) + begin dup acpi-timer@ - 0< until ( end ) + drop +; +: acpi-ms ( us -- ) + d# 3580 * acpi-timer@ + ( end ) + begin dup acpi-timer@ - 0< until ( end ) + drop +; + +[ifdef] tsc@ +: acpi-calibrate-tsc ( -- ) + tsc@ d# 100 acpi-ms tsc@ ( d.start d.end ) + 2swap d- ( d.delta ) + 2dup d# 100 um/mod nip to ms-factor ( d.delta ms ) + d# 100,000 um/mod nip to us-factor ( ) +; +[else] +: us ( us -- ) acpi-us ; +' acpi-ms to ms +\ Timing tools +variable timestamp1 +: t( ( -- ) acpi-timer@ timestamp1 ! ; +: )t ( -- ) + acpi-timer@ timestamp1 @ - d# 1000 d# 3580 */ ( microseconds ) + push-decimal + <# u# u# u# [char] , hold u# u#s u#> type ." uS " + pop-base +; + +[then] + +\ 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
Modified: cpu/x86/pc/olpc/via/addrs.fth =================================================================== --- cpu/x86/pc/olpc/via/addrs.fth 2009-04-25 04:25:27 UTC (rev 1158) +++ cpu/x86/pc/olpc/via/addrs.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -50,7 +50,14 @@ h# fe01.b000 constant ehci-pci-base h# fe02.4000 constant sd-pci-base h# fe02.8000 constant camera-pci-base +h# fec0.0000 constant ioapic-mmio-base +h# fed0.0000 constant hpet-mmio-base +h# fed3.0000 constant spi-mmio-base +h# fed4.0000 constant wdt-mmio-bast
+h# 4000 constant acpi-io-base +h# 4100 constant smbus-io-base + h# 9.fc00 constant 'ebda \ Extended BIOS Data Area, which we co-opt for our real-mode workspace
h# e0000 constant rsdp-adr
Modified: cpu/x86/pc/olpc/via/config.fth =================================================================== --- cpu/x86/pc/olpc/via/config.fth 2009-04-25 04:25:27 UTC (rev 1158) +++ cpu/x86/pc/olpc/via/config.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -13,7 +13,7 @@
\ create virtual-mode create addresses-assigned \ Define if base addresses are already assigned -create serial-console \ Define to default to serial port for console +\ create serial-console \ Define to default to serial port for console create pc create linux-support create use-elf
Modified: cpu/x86/pc/olpc/via/devices.fth =================================================================== --- cpu/x86/pc/olpc/via/devices.fth 2009-04-25 04:25:27 UTC (rev 1158) +++ cpu/x86/pc/olpc/via/devices.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -15,16 +15,23 @@ \ Use the CPU chip's Time Stamp Counter for timing; it does just what we want fload ${BP}/cpu/x86/tsc.fth
-stand-init: +\ Calibrate the Time Stamp Counter using the ACPI timer +fload ${BP}/cpu/x86/acpitimer.fth + +fload ${BP}/cpu/x86/pc/olpc/via/smbus.fth \ SMBUS driver + +\ Do this early so the interact timing works right +: stand-init-io ( -- ) + stand-init-io + d# 1,500,000,000 " VIA,C7"
" /cpu" find-device ( cpu-clock-hz model$ ) " model" string-property ( cpu-clock-hz ) - dup " clock-frequency" integer-property ( cpu-clock-hz ) - device-end ( cpu-clock-hz ) + " clock-frequency" integer-property ( ) + device-end ( )
- d# 2000 / dup to ms-factor ( cpu-clock-khz ) - d# 1000 / to us-factor ( ) + acpi-calibrate-tsc ;
[ifdef] use-ega
Modified: cpu/x86/pc/olpc/via/fw.bth =================================================================== --- cpu/x86/pc/olpc/via/fw.bth 2009-04-25 04:25:27 UTC (rev 1158) +++ cpu/x86/pc/olpc/via/fw.bth 2009-04-29 05:55:31 UTC (rev 1159) @@ -64,8 +64,7 @@ dev / 1 encode-int " #address-cells" property 1 encode-int " #size-cells" property -" OLPC" encode-string " architecture" property -device-end +dend
\ Memory management services [ifdef] virtual-mode @@ -86,6 +85,17 @@
fload ${BP}/cpu/x86/pc/rootnode.fth \ Platform-specific root node changes
+dev / +1 encode-int " #address-cells" property +1 encode-int " #size-cells" property +" OLPC" encode-string " architecture" property +[ifdef] demo-board +" VIA Demo Board" " banner-name" string-property +[else] +" OLPC XO 1.5" " banner-name" string-property +[then] +device-end + fload ${BP}/cpu/x86/pc/olpc/port80.fth \ Port 80 debug messages
[ifdef] Later @@ -233,11 +243,10 @@
hex : i-key-wait ( ms -- pressed? ) - ['] key? (see) cr ." Type 'i' to interrupt stand-init sequence" cr 0 do - key? if - key upc ascii I = if true unloop exit then + ukey? if + ukey upc ascii I = if true unloop exit then then 1 ms loop @@ -258,9 +267,8 @@
standalone? if disable-interrupts -interact -[ifdef] Later - d# 300 +\ interact + d# 1000 i-key-wait if [ifdef] Later protect-fw @@ -271,9 +279,6 @@ [ifdef] Later setup [then] -[else] - cr -[then] then ; \ warning ! @@ -548,12 +553,8 @@ ; [then]
- [ifdef] Later : console-start ( -- ) -[ifdef] rom-loaded - video-map cr -[then] " screen" open-dev ?dup if set-stdout \ logo-banner drop @@ -568,6 +569,7 @@ \ use-nvramrc? if nvramrc safe-evaluate then ; [then] + : debug-interact ( -- ) early-interact? if " Interrupting startup sequence prior to probing" .because @@ -657,6 +659,9 @@ [then] ['] (interrupt-auto-boot?) to interrupt-auto-boot? ?usb-keyboard + install-console + install-dual-console + banner [ifdef] Later auto-boot [then] @@ -665,10 +670,10 @@ frozen? ( frozen? ) unfreeze visible ( frozen? ) if banner then \ Reissue banner if it was suppressed -[then]
blue-letters ." Type 'help' for more information." black-letters cr cr +[then]
quit ;
Modified: cpu/x86/pc/olpc/via/pcinode.fth =================================================================== --- cpu/x86/pc/olpc/via/pcinode.fth 2009-04-25 04:25:27 UTC (rev 1158) +++ cpu/x86/pc/olpc/via/pcinode.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -30,11 +30,13 @@ \ 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 preassigned-pci-slot? and if ( phys.lo phys.mid phys.hi len ) - 2swap 2drop >r ( phys.hi r: len ) - dup config-l@ 1 invert and r> ( phys.hi paddr len ) - exit - then + dup -1 <> if ( phys.lo phys.mid phys.hi len ) + over preassigned-pci-slot? if ( phys.lo phys.mid phys.hi len ) + 2swap 2drop >r ( phys.hi r: len ) + dup config-l@ 1 invert and r> ( phys.hi paddr len ) + exit + then ( phys.lo phys.mid phys.hi len ) + then ( phys.lo phys.mid phys.hi len | -1 ) assign-pci-addr ; warning !
Modified: cpu/x86/pc/olpc/via/romreset.bth =================================================================== --- cpu/x86/pc/olpc/via/romreset.bth 2009-04-25 04:25:27 UTC (rev 1158) +++ cpu/x86/pc/olpc/via/romreset.bth 2009-04-29 05:55:31 UTC (rev 1159) @@ -302,7 +302,7 @@ 1 [if] \ This turns an OS reboot into a real cold start - from coreboot 4001 8888 config-ww \ Set ACPI base address - 84 8881 config-wb \ Enable ACPI regs and guard RTC against power glitches + 8c 8881 config-wb \ Enable ACPI regs, 32-bit PM timer, guard RTC against power glitches 4004 port-rw \ Get APCI Status register d# 10 # ax shr 7 # ax and 1 # ax cmp <> if \ Not a wakeup from S3 380 config-rb ax ax or 0<> if \ C-page shadowing not on yet
Modified: dev/mmc/sdhci/sdhci.fth =================================================================== --- dev/mmc/sdhci/sdhci.fth 2009-04-25 04:25:27 UTC (rev 1158) +++ dev/mmc/sdhci/sdhci.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -17,16 +17,30 @@
" sdhci" " compatible" string-property
-h# 4000 constant /regs +h# 100 value /regs \ Standard size of SDHCI register block +1 value #slots
: phys+ encode-phys encode+ ; : i+ encode-int encode+ ;
-0 0 encode-bytes -0 0 h# 0000.0000 my-space + phys+ 0 i+ h# 0000.0100 i+ \ Config registers -0 0 h# 0100.0010 my-space + phys+ 0 i+ /regs i+ \ Frame buffer -" reg" property +: make-reg ( -- ) + 0 0 encode-bytes + 0 0 h# 0000.0000 my-space + phys+ 0 i+ h# 0000.0100 i+ \ Config registers
+ my-space " config-l@" $call-parent h# 410111ab = if \ Marvell CaFe chip + h# 4000 to /regs + then + + h# 40 my-space + " config-b@" $call-parent ( slot_info ) + 4 rshift 7 and 1+ ( #slots ) + 0 ?do + 0 0 h# 0100.0010 i 4 * + my-space + phys+ 0 i+ /regs i+ \ Operational regs for slot N + loop + " reg" property +; +make-reg + + 0 value debug?
0 value chip @@ -638,7 +652,7 @@ : power-up-card ( -- false | retry? true ) intstat-on card-power-off d# 20 ms - card-power-on d# 20 ms \ This delay is just a guess + card-power-on d# 40 ms \ This delay is just a guess (20 was barely too slow for a Via board) card-inserted? 0= if card-power-off intstat-off false true exit then card-clock-slow d# 10 ms \ This delay is just a guess reset-card \ Cmd 0
Modified: dev/pcibus.fth =================================================================== --- dev/pcibus.fth 2009-04-25 04:25:27 UTC (rev 1158) +++ dev/pcibus.fth 2009-04-29 05:55:31 UTC (rev 1159) @@ -73,9 +73,9 @@ \ XXX we need a sophisticated IO space allocator that accounts for \ hardwired devices
-: self-b@ ( phys.hi -- l ) " config-b@" $call-self ; -: self-l@ ( phys.hi -- l ) " config-l@" $call-self ; -: self-l! ( l phys.hi -- ) " config-l!" $call-self ; +: self-b@ ( phys.hi -- l ) h# ff.ffff and " config-b@" $call-self ; +: self-l@ ( phys.hi -- l ) h# ff.ffff and " config-l@" $call-self ; +: self-l! ( l phys.hi -- ) h# ff.ffff and " config-l!" $call-self ; : 64mem? ( phys.hi -- flag ) self-l@ 7 and 4 = ; : io? ( phys.hi -- flag ) \ For expansion ROM base address registers, the LSB is an enable bit,