Author: wmb Date: Mon Oct 3 23:13:33 2011 New Revision: 2567 URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2567
Log: OLPC XO-1.75 - Added suspend/resume test to "test /memory", cleaning up rtc.fth in the process.
Modified: cpu/arm/mmp2/dramrecal.fth cpu/arm/mmp2/rtc.fth cpu/arm/olpc/1.75/probemem.fth
Modified: cpu/arm/mmp2/dramrecal.fth ============================================================================== --- cpu/arm/mmp2/dramrecal.fth Mon Oct 3 22:57:06 2011 (r2566) +++ cpu/arm/mmp2/dramrecal.fth Mon Oct 3 23:13:33 2011 (r2567) @@ -296,7 +296,6 @@ 1 swap lshift and 0<> ( flag ) ;
-: icu@ ( offset -- value ) h# 28.2000 + io@ ; : .masked ( irq# -- ) dup /l* h# 10c + icu@ ( irq# masked ) 1 and if ( irq# ) @@ -571,10 +570,10 @@ h# b0 d# 15 af! \ Wake SP on rotate key h# 220 d# 71 af! \ Wake SP on KBD CLK falling edge h# 221 d# 160 af! \ Wake SP on TPD CLK falling edge - h# 4c mpmu@ h# 20.0000 or h# 4c mpmu! \ Keypress wakes SP + h# 4c +mpmu h# 20.0000 io-set \ Keypress wakes SP ['] disable-int40 d# 40 interrupt-handler! d# 40 enable-interrupt \ SP to PJ4 communications interrupt - h# 2900cc io@ 1 invert and h# 2900cc io! \ Unmask the communications interrupt + 1 h# 29.00cc 1 io-clr \ Unmask the inter-processor communications interrupt ;
: breadcrumb ( n -- ) h# d000.0110 l! ;
Modified: cpu/arm/mmp2/rtc.fth ============================================================================== --- cpu/arm/mmp2/rtc.fth Mon Oct 3 22:57:06 2011 (r2566) +++ cpu/arm/mmp2/rtc.fth Mon Oct 3 23:13:33 2011 (r2567) @@ -1,96 +1,34 @@ +\ See license at end of file purpose: Driver for MMP2 internal RTC
-\ This code was written as a test/demonstration of using -\ the MMP2 internal RTC to generate alarm interrupts. -\ It is not currently used by anything, and should it -\ ever be needed, it should be put in a device node. +\ Interrupt 5 combines two interrupt inputs, RTC INT (bit 1) and RTC ALARM (bit 0) +: int5-mask ( -- offset ) h# 16c +icu ; +: int5-status@ ( -- value ) h# 154 icu@ ;
-: int5-mask! ( value -- ) h# 28.216c io! ; -: int5-mask@ ( -- value ) h# 28.216c io@ ; -: int5-status@ ( -- value ) h# 28.2154 io@ ; -: enable-rtc ( -- ) h# 81 h# 01.5000 io! ; +: enable-rtc ( -- ) h# 81 0 apbc! ; \ Turn on the clock for the internal RTC : enable-rtc-wakeup ( -- ) - h# 004c mpmu@ h# 2.0010 or h# 004c mpmu! - h# 104c mpmu@ h# 2.0010 or h# 104c mpmu! + h# 2.0010 h# 104c +mpmu io-set ; : soc-rtc@ ( offset -- value ) h# 01.0000 + io@ ; : soc-rtc! ( value offset -- value ) h# 01.0000 + io! ; : cancel-alarm ( -- ) 0 8 soc-rtc! - int5-mask@ 1 or int5-mask! \ Mask alarm + 1 int5-mask io-set \ Mask alarm ; -: take-alarm ( -- ) - ." Alarm fired" cr - cancel-alarm -; -: alarm-in-3 ( -- ) - enable-rtc \ Turn on clocks - - int5-mask@ 1 invert and int5-mask! \ Unmask alarm - enable-rtc-wakeup - 0 soc-rtc@ d# 3 + 4 soc-rtc! \ Set alarm for 3 seconds from now - 7 8 soc-rtc! \ Ack old interrupts and enable new ones - ['] take-alarm 5 interrupt-handler! - 5 enable-interrupt -; -: alarm-in-1 ( -- ) - enable-rtc \ Turn on clocks - - int5-mask@ 1 invert and int5-mask! \ Unmask alarm - enable-rtc-wakeup - 0 soc-rtc@ d# 1 + 4 soc-rtc! \ Set alarm for 3 seconds from now - 7 8 soc-rtc! \ Ack old interrupts and enable new ones - ['] cancel-alarm 5 interrupt-handler! - 5 enable-interrupt -; -: wake1 ( -- ) - enable-rtc \ Turn on clocks - - int5-mask@ 1 invert and int5-mask! \ Unmask alarm - enable-rtc-wakeup - 0 soc-rtc@ d# 2 + 4 soc-rtc! \ Set alarm for 2 seconds from now - 7 8 soc-rtc! \ Ack old interrupts and enable new ones - ['] cancel-alarm 5 interrupt-handler! - 5 enable-interrupt -; -: alarm1 ( -- ) - enable-rtc \ Turn on clocks +: take-alarm ( -- ) ." Alarm fired" cr cancel-alarm ; +: rtc-wake ( handler-xt #seconds -- ) + enable-rtc ( handler-xt #seconds ) \ Turn on clocks
- int5-mask@ 1 invert and int5-mask! \ Unmask alarm - enable-rtc-wakeup - 0 soc-rtc@ d# 1 + 4 soc-rtc! \ Set alarm for 3 seconds from now - 7 8 soc-rtc! \ Ack old interrupts and enable new ones - ['] take-alarm 5 interrupt-handler! - 5 enable-interrupt -; -: test1 - 0 - begin - alarm1 - str - (cr dup . 1+ - d# 500 ms - key? until -; -: test2 - 0 - begin - wake1 - str - (cr dup . 1+ - d# 500 ms - key? until -; -: test3 - 0 - begin - wake1 - str - cr dup . 1+ - d# 500 ms - key? until -; -: test4 + 1 int5-mask io-clr ( handler-xt #seconds ) \ Unmask alarm + enable-rtc-wakeup ( handler-xt #seconds ) + 0 soc-rtc@ + 4 soc-rtc! ( handler-xt ) \ Set alarm for 2 seconds from now + 7 8 soc-rtc! ( handler-xt ) \ Ack old interrupts and enable new ones + 5 interrupt-handler! ( ) + 5 enable-interrupt ( ) +; +: wake1 ( -- ) ['] cancel-alarm 1 rtc-wake ; +: alarm-in-3 ( -- ) ['] take-alarm 3 rtc-wake ; +: wakeup-loop ( -- ) d# 1000000 0 do 0 d# 13 at-xy i .d 5 0 do @@ -101,11 +39,47 @@ loop 5 +loop ; +alias test4 wakeup-loop
-\ test3 -\ wake1 str cr - -\ patch noop cr take-alarm test1 -\ patch (cr cr take-alarm test1 +: s3-selftest ( -- error? ) + \ The general failure mode here is that it won't wake up, so + \ it's hard to return a real error code. We just have to rely + \ on the operator. + ." Testing suspend/resume" cr + ." Sleeping for 3 seconds .. " d# 100 ms + ec-rst-pwr ['] cancel-alarm 3 rtc-wake str ec-max-pwr ( power ) + \ Negative power is consumed from battery, positive is supplied to battery + dup d# -250 < if ( power ) + ." System used too much power during suspend - " negate .d ." mW" cr ( ) + true ( error? ) + else ( power ) + drop false ( error? ) + then ( error? ) +; +dev /memory +[ifdef] test-s3 ' s3-selftest to test-s3 [then] +dend
-\ : cx cr d# 400 ms ; patch cx cr take-alarm test1 +\ LICENSE_BEGIN +\ Copyright (c) 2011 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/arm/olpc/1.75/probemem.fth ============================================================================== --- cpu/arm/olpc/1.75/probemem.fth Mon Oct 3 22:57:06 2011 (r2566) +++ cpu/arm/olpc/1.75/probemem.fth Mon Oct 3 23:13:33 2011 (r2567) @@ -60,6 +60,8 @@ [then] : .chunk ( adr len -- ) ." Testing address 0x" swap 8u.h ." length 0x" 8u.h cr ;
+defer test-s3 ( -- error? ) ' false is test-s3 + : test-mem ( adr len -- ) \ Test a chunk 'o memory 2>r 2r@ 0 mem-claim to p-adr ( ) ( r: adr len ) @@ -101,12 +103,12 @@ 2dup .chunk ( adr len this-len r: this-padr ) test-mem ( adr len ) mem-fail? if ( adr len ) - 2drop true exit ( -- error ) + 2drop true exit ( -- error? ) then ( adr len ) repeat ( adr len ) 2drop ( )
- mem-fail? + test-s3 ( error? ) ;
device-end