[openfirmware] r1068 - cpu/x86/pc/olpc dev/geode

svn at openfirmware.info svn at openfirmware.info
Fri Jan 9 07:08:34 CET 2009


Author: wmb
Date: 2009-01-09 07:08:34 +0100 (Fri, 09 Jan 2009)
New Revision: 1068

Added:
   cpu/x86/pc/olpc/biosresume.fth
Modified:
   cpu/x86/pc/olpc/dsdt.dsl
   cpu/x86/pc/olpc/fw.bth
   dev/geode/smi.fth
Log:
OLPC - fix problems with lid switch handling for Windows resume,
including big cleanup of ACPI DSDT code.






Added: cpu/x86/pc/olpc/biosresume.fth
===================================================================
--- cpu/x86/pc/olpc/biosresume.fth	                        (rev 0)
+++ cpu/x86/pc/olpc/biosresume.fth	2009-01-09 06:08:34 UTC (rev 1068)
@@ -0,0 +1,101 @@
+purpose: Platform-specific parts of BIOS emulation for Windows support
+\ See license at end of file
+
+\ Workaround for problems with the way that Windows manages the
+\ GPIOs for lid wakeup.  To understand this, you need to understand
+\ the Geode GPIO hardware, which is confusing and poorly documented.
+\ See http://wiki.laptop.org/images/4/46/GPIO.png for a diagram.
+
+\ The following LID wakeup frobbing is not needed anymore;
+\ I figured out how to do it in ACPI (which was fairly tricky)
+0 [if]
+0 value negedge-ena-state
+0 value posedge-ena-state
+
+h# 400 constant lid-gpio       \ GPIO 26
+h# 4000.0000 constant lid-pme  \ PME mapper 6
+: setup-lid-wakeup  ( -- )
+   h# c0 gpio@ to posedge-ena-state
+   h# c4 gpio@ to negedge-ena-state
+   lid-gpio h# c8 gpio!  lid-gpio h# cc gpio!  \ Clear both edge status latches
+   d# 100 us   \ Wait for the synchronizer (32 kHz clock)
+
+   \ Empirically, Windows tries to control the wakeup policy by flipping
+   \ the input invert bit.  If you suspend from the power button, the
+   \ input invert is on at this point, whereas if you suspend by closing
+   \ the lid, input invert is off.  That doesn't quite work right - in
+   \ the power-button-suspend case, subsequently closing the lid causes
+   \ a wakeup!  To fix the problem, we switch to edge-detector wakeup.
+   \ We leave the invert/no-invert setting as is, and choose which edge
+   \ to wakeup on.  In both cases we want to wakeup on the lid-opening
+   \ event, but which edge that is depends on the inversion state.
+
+   h# a4 gpio@ lid-gpio and  if
+      \ Lid input is inverted.  Lid opening causes rising edge on pin,
+      \ inverted to falling edge internally, so wakeup on negative edge.
+
+      lid-gpio >clr h# c0 gpio!  lid-gpio h# c4 gpio!
+   else
+      \ Lid input is not inverted.  Lid opening causes rising edge on pin,
+      \ so rising edge internally, so wakeup on positive edge.
+
+      lid-gpio >clr h# c4 gpio!  lid-gpio h# c0 gpio!
+   then
+   d# 100 us   \ Wait for the synchronizer (32 kHz clock)
+   lid-pme h# 18 acpi-l!   \ Clear the final latch
+;
+: cleanup-lid-wakeup  ( -- )
+   posedge-ena-state  h# c0 gpio!
+   negedge-ena-state  h# c4 gpio!
+;
+[then]
+
+: suspend-ps2  ( -- )
+   " default-disable-kbd" kbd-ih $call-method   \ Stop keyboard
+   1 " set-port" kbd-ih $call-method    \ Select mouse (touchpad) port
+   " default-disable-kbd" kbd-ih $call-method   \ Stop mouse
+;
+: resume-ps2  ( -- )
+   " enable-scan" kbd-ih $call-method   \ Restart mouse
+   0 " set-port" kbd-ih $call-method    \ Select keyboard port
+   " enable-scan" kbd-ih $call-method   \ Restart keyboard
+;
+
+: (suspend-devices)  ( -- )
+   dcon-power-off
+   wlan-freeze
+   suspend-ps2
+   [ifdef] setup-lid-wakeup  setup-lid-wakeup  [then]
+;
+: (resume-devices)  ( -- )
+   [ifdef] cleanup-lid-wakeup  cleanup-lid-wakeup  [then]
+   resume-ps2
+   wlan-reset
+   dcon-power-on  d# 10 ms  " dcon-restart" screen-ih $call-method
+;
+' (suspend-devices) to suspend-devices
+' (resume-devices) to resume-devices
+
+\ 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/dsdt.dsl
===================================================================
--- cpu/x86/pc/olpc/dsdt.dsl	2009-01-07 09:14:26 UTC (rev 1067)
+++ cpu/x86/pc/olpc/dsdt.dsl	2009-01-09 06:08:34 UTC (rev 1068)
@@ -16,34 +16,34 @@
         "OLPC XO-1", 
         "$Id$"
     })
-    OperationRegion (VSA1, SystemIO, 0xAC1C, 0x04)
-    Field (VSA1, WordAcc, NoLock, Preserve) {
-        VSA2,   16, 
-        VSA3,   16
-    }
+//  OperationRegion (VSA1, SystemIO, 0xAC1C, 0x04)
+//  Field (VSA1, WordAcc, NoLock, Preserve) {
+//      VSA2,   16, 
+//      VSA3,   16
+//  }
 
-    Mutex (VSA4, 0x00)
+//  Mutex (VSA4, 0x00)
 
-    Method (VSAR, 1, Serialized) {    // VSAR  (index -- resword )
-        Name (VRRR, Zero)
-        Acquire (VSA4, 0xFFFF)
-        Store (0xFC53, VSA2) // Unlock
-        Store (Arg0, VSA2)
-        Store (VSA3, Local1)
-        Release (VSA4)
-        Store (Local1, VRRR)
-        Return (VRRR)
-    }
+//  Method (VSAR, 1, Serialized) {    // VSAR  (index -- resword )
+//      Name (VRRR, Zero)
+//      Acquire (VSA4, 0xFFFF)
+//      Store (0xFC53, VSA2) // Unlock
+//      Store (Arg0, VSA2)
+//      Store (VSA3, Local1)
+//      Release (VSA4)
+//      Store (Local1, VRRR)
+//      Return (VRRR)
+//  }
 
-    Method (VSAW, 2, Serialized) {  // VSAW ( index value -- )
-        Acquire (VSA4, 0xFFFF)
-        Store (0xFC53, VSA2) // Unlock
-        Store (Arg0, VSA2)
-        Store (Arg1, VSA3)
-        Release (VSA4)
-    }
+//  Method (VSAW, 2, Serialized) {  // VSAW ( index value -- )
+//      Acquire (VSA4, 0xFFFF)
+//      Store (0xFC53, VSA2) // Unlock
+//      Store (Arg0, VSA2)
+//      Store (Arg1, VSA3)
+//      Release (VSA4)
+//  }
 
-//    Mutex (ECMX, 0x00)
+//  Mutex (ECMX, 0x00)
 
     OperationRegion (UART, SystemIO, 0x03f8, 0x07)
 
@@ -59,8 +59,7 @@
     }
     Method (UPUT, 1, NotSerialized)
     {
-        While( LEqual (And (USTA, 0x20), Zero) )
-        {
+        While( LEqual (And (USTA, 0x20), Zero) ) {
             Stall (99)
         }
         Store (Arg0, UDAT)
@@ -70,8 +69,7 @@
     {
         
         And (ShiftRight (Arg0, 4), 0xF, Local0)
-        If (LLess (Local0, 10))
-        {
+        If (LLess (Local0, 10)) {
             Add (Local0, 0x30, Local0)  // '0'
         } Else {
             Add (Local0, 0x57, Local0)  // 'a' - 10
@@ -79,8 +77,7 @@
         UPUT (Local0)
         
         And (Arg0, 0xF, Local0)
-        If (LLess (Local0, 10))
-        {
+        If (LLess (Local0, 10)) {
             Add (Local0, 0x30, Local0)  // '0'
         } Else {
             Add (Local0, 0x57, Local0)  // 'a' - 10
@@ -101,16 +98,16 @@
 
     Method (ECRD, 1, NotSerialized)
     {
-//        Acquire (ECMX, 5000)
+//      Acquire (ECMX, 5000)
         Store (ShiftRight (Arg0, 0x08), EIXH)
         Store (And (Arg0, 0xFF), EIXL)
-//        Sleep (15)
+//      Sleep (15)
         Stall(255)
         Store (EDAT, Local0)
-//        UDOT (Local0)
+//      UDOT (Local0)
         Stall(255)
-//        Sleep (15)
-//        Release (ECMX)
+//      Sleep (15)
+//      Release (ECMX)
         Return (Local0)
     }
 
@@ -184,52 +181,76 @@
 
     Scope (_PR) {
         Processor (CPU0, 0x01, 0x00000000, 0x00) {}
-//        Processor (CPU0, 0x01, 0x00009E00, 0x06) {
-//            Name (_PCT, Package (0x02) {
-//                ResourceTemplate () {
-//                    Register (SystemIO, 0x08, 0x00, 0x0000000000009C2C, ,)
-//                }, 
+//      Processor (CPU0, 0x01, 0x00009E00, 0x06) {
+//          Name (_PCT, Package (0x02) {
+//              ResourceTemplate () {
+//                  Register (SystemIO, 0x08, 0x00, 0x0000000000009C2C, ,)
+//              }, 
 //
-//                ResourceTemplate () {
-//                    Register (SystemIO, 0x08, 0x00, 0x0000000000009C2C, ,)
-//                }
-//            })
-//            // Question: Why have two identical performance states?
-//            Name (_PSS, Package (0x02) {
-//                Package (0x06) { 0x01B1, 0x03BF, 0x2D, Zero, 0x0D, 0x0D }, 
-//                Package (0x06) { 0x01B1, 0x03BF, 0x2D, Zero, 0x0D, 0x0D }
-//            })
-//            Name (_PPC, Zero)
-//        }
+//              ResourceTemplate () {
+//                  Register (SystemIO, 0x08, 0x00, 0x0000000000009C2C, ,)
+//              }
+//          })
+//          // Question: Why have two identical performance states?
+//          Name (_PSS, Package (0x02) {
+//              Package (0x06) { 0x01B1, 0x03BF, 0x2D, Zero, 0x0D, 0x0D }, 
+//              Package (0x06) { 0x01B1, 0x03BF, 0x2D, Zero, 0x0D, 0x0D }
+//          })
+//          Name (_PPC, Zero)
+//      }
     }
 
     Name (_S0, Package (0x04) { Zero, Zero, Zero, Zero })  // Values for PM1a,b_CNT.SLP_TYP registers
     Name (_S1, Package (0x04) { One, One, Zero, Zero })
     Name (_S3, Package (0x04) { 0x03, 0x03, Zero, Zero })
     Name (_S5, Package (0x04) { 0x05, 0x05, Zero, Zero })
-    Name (_SB.ZZY2, Zero)
-    Name (ZZY1, Zero)  // Current state - see _SST page 298 for values
-    Name (ZZY3, Zero)  // "Already inited" flag
-    Name (ZZY4, Zero)  // EBDA base address in bytes
-//  Name (ZZY5, Zero)  // Set to EBDA length in bytes - unused
-    Name (ZZY6, Zero)  // Set to memory size in Kbytes
+    Name (SLPS, Zero)  // Current state - see _SST page 298 for values
+    Name (INID, Zero)  // "Already inited" flag
+    Name (EBBA, Zero)  // EBDA base address in bytes
+    Name (MEMK, Zero)  // Set to memory size in Kbytes
 
+    OperationRegion (GPIO, SystemIO, 0x1000, 0x0100)
+    Field (GPIO, DWordAcc, NoLock, Preserve) {
+//              Offset (0x38), 
+//      GLEE,   32
+                Offset (0xA4),
+        GHIN,   32,               // High bank Input Invert
+                Offset (0xB0),    // High bank read back
+            ,   10, 
+        LSWI,   1,                // Lid switch bit
+                Offset (0xB8),
+        GHEE,   32,               // High bank events enable
+                Offset (0xC0),
+        GHPE,   32,               // High bank posedge enable
+        GHNE,   32,               // High bank negedge enable
+        GHPS,   32,               // High bank posedge status
+        GHNS,   32                // High bank negedge status
+    }
+
     Method (_PTS, 1, NotSerialized) {
-// VSAW(0, 0xc)
- Store (Arg0, \_SB.ZZY2) }
+//      UPUT(0x50) // P
+        Store (Arg0, SLPS)
 
-//    Method (_GTS, 1, NotSerialized) {  /* VSAW(0, 0xb) */  }  // GoingToSleep
-//    Method (_BFS, 1, NotSerialized) {  /* VSAW(0, 0xa) */   }  // Back from sleep
+        // Having committed to sleeping, switch the lid switch edge
+        // detector to look for the positive edge, i.e. the lid-open event
+        Store (0x4000000, GHEE)       // Disable events
+        Store (0x400, GHNS)           // Clear lid negative status
+        Store (0x400, GHPS)           // Clear lid positive status
+        Store (    0x400, GHPE)       // Look for lid opening
+        Store (0x4000000, GHNE)       // .. not lid closing
+        Stall (100)                   // Let the synchronizers settle
+        Store (0x400, GHEE)           // Enable events
+    }
 
-    Method (_WAK, 1, NotSerialized) {  // Arg is the sleeping state
-// VSAW(0, 9)
-        Store (Zero, \_SB.ZZY2)
+    Method (_WAK, 1, NotSerialized) {  // Arg is the previous sleeping state
+//      UPUT(0x57)   // W
+        Store (Zero, SLPS)
         Switch (Arg0) {
             Case (One) {
-                Notify (\_SB.PCI0.USB0, Zero)
-                Notify (\_SB.PCI0.USB1, Zero)
-//                Notify (\_SB.PCI0.SBF0.KBC, Zero)
-//                Notify (\_SB.PCI0.SBF0.PS2M, Zero)
+                Notify (\_SB.PCI0.USB0, Zero)        // Re-enumerate USB bus after wakeup
+                Notify (\_SB.PCI0.USB1, Zero)        // Re-enumerate USB bus after wakeup
+//              Notify (\_SB.PCI0.SBF0.KBC, Zero)    // Don't re-enumerate KBC because it is not pluggable
+//              Notify (\_SB.PCI0.SBF0.PS2M, Zero)   // Don't re-enumerate PS/2 mouse because it is not pluggable
             }
             Case (0x03) {
                 Notify (\_SB.PCI0, Zero)
@@ -238,91 +259,84 @@
         Return (Zero)  /* Success */
     }
 
-    Scope (_GPE) {                          // General Purpose Events
+// Windows XP doesn't use _GTS, _BTS, or _TTS, sadly
+// _TTS would make the lid event handling much saner
 
+    Scope (_GPE) {                            // General Purpose Events
+
         // pdf p 162 has Notify argument values
-        Method (_L00, 0, NotSerialized) {            // Level-triggered event 0
-// VSAW(0, 8)
-            If (LEqual (ZZY1, One)) {                // no state or working state
-//                Notify (\_SB.PCI0.SBF0.KBC, 0x02)
-//                Notify (\_SB.PCI0.SBF0.PS2M, 0x02)
+        Method (_L00, 0, NotSerialized) {     // Level-triggered event 0
+            If (LEqual (SLPS, One)) {         // no state or working state
+//              Notify (\_SB.PCI0.SBF0.KBC, 0x02)
+//              Notify (\_SB.PCI0.SBF0.PS2M, 0x02)
                 Notify (\_SB.PCI0.SBF0, 0x02)
             }
         }
 
         // Likely unnecessary
-//        Method (_L05, 0, NotSerialized)
-//        {
-//            // DDD geoderom guards this with If (LEqual (ZZY1, One))
-//            Notify (\_SB.PCI0.USB0, 0x02)
-//        }
+//      Method (_L05, 0, NotSerialized)
+//      {
+//          // DDD geoderom guards this with If (LEqual (SLPS, One))
+//          Notify (\_SB.PCI0.USB0, 0x02)
+//      }
 
         // XXX probably pointless as power is off
-        Method (_L06, 0, NotSerialized) {            // USB event
-// VSAW(0, 7)
-            If (LEqual (ZZY1, One)) {                // no state or working state
+        Method (_L06, 0, NotSerialized) {     // USB event
+            If (LEqual (SLPS, One)) {         // no state or working state
                 Notify (\_SB.PCI0.USB0, 0x02)
             }
 
             Notify (\_SB.PCI0.USB1, 0x02)
         }
         
-        Method (_L1E, 0, NotSerialized) {            // Comes from IRQ/PME Mapper bit 6 - LID switch
-// VSAW(0, 6)
-//            UPUT(0x4C)               // L
-//            UPUT(Add(0x30, ZZY1))
-            If (LEqual (\_SB.ZZY2, Zero)) {          // Not preparing to sleep
-//                If (LLess (ZZY1, 0x02)) {            // no state or working state or waking
-                    Notify (\_SB.LIDS, 0x80)         // Request to go to sleep
-//                }
+        Method (_L1E, 0, NotSerialized) {     // Comes from IRQ/PME Mapper bit 6 - LID switch
+            If (LEqual (SLPS, Zero)) {        // Not preparing to sleep
+//              UPUT(0x4D)                    // M
+                Notify (\_SB.LIDS, 0x80)      // Request to go to sleep
             } Else {
-                Notify (\_SB.LIDS, 0x02)             // Request to wake up
+//              UPUT(0x6d)                    // m
+                Notify (\_SB.LIDS, 0x02)      // Request to wake up
             }
         }
 
-        Method (_L1F, 0, NotSerialized) {            // Comes from IRQ/PME Mapper bit 7 - SCI
-// VSAW(0, 5)
-//            UPUT(0x53)               // S
+        Method (_L1F, 0, NotSerialized) {     // Comes from IRQ/PME Mapper bit 7 - SCI
+//          UPUT(0x53)                        // S
 
             Store (One, Local0)
             While (Local0)
             {
-                Store (ECC1(0x84), Local0)  // Read SCI Queue
-//                UDOT (Local0)
+                Store (ECC1(0x84), Local0)    // Read SCI Queue
+//              UDOT (Local0)
                 If (And(Local0, 0x40))
                 {
-                    Notify (\_SB.AC, 0x80)
+                    Notify (\_SB.AC, 0x80)    // Tell OS native driver that AC status has changed
                 }
                 If (And(Local0, 0x0e))
                 {
-                    Notify (\_SB.BATT, 0x80)
+                    Notify (\_SB.BATT, 0x80)  // Tell OS native driver that battery status has changed
                 }
             }
 
-//              Notify (\_SB.PCI0, 0x02)                 // Request to wake up from EC
-//              Notify (\_SB.AC, 0x80)
-//              Notify (\_SB.BATT, 0x80)
-//            UPUT(0x54)               // T
+//          Notify (\_SB.PCI0, 0x02)          // Request to wake up from EC
+//          Notify (\_SB.AC, 0x80)
+//          Notify (\_SB.BATT, 0x80)
+//          UPUT(0x54)                        // T
         }
     }
 
     // This is an indicator method - it sets LEDs based on the sleep state
     Scope (_SI) {
         Method (_SST, 1, NotSerialized) {
-//            UPUT(0x24)  // $
-//            UPUT(Add(0x30, Arg0))
-// VSAW(1, Arg0)
-// XXX ??? need to set LEDs by doing VR accesses - or probably the EC does it automatically
-            Store (Arg0, ZZY1)
+            // The EC handles the LEDs for us
         }
     }
 
     Scope (_SB) {
         Method (_INI, 0, NotSerialized) {
-            If (LEqual (ZZY3, One)) {
+            If (LEqual (INID, One)) {
                 Return
             }
-            Store (One, ZZY3)
+            Store (One, INID)
 
             CreateWordField (^LNKA._PRS, One, IBMA)
             CreateWordField (^LNKB._PRS, One, IBMB)
@@ -335,8 +349,8 @@
             }
 
             Store (QQH2, Local0)   // Memory address 0x40e - EBDA address from BIOS data area
-            ShiftLeft (Local0, 0x04, ZZY4)
-            OperationRegion (EBDA, SystemMemory, ZZY4, 0x0400)
+            ShiftLeft (Local0, 0x04, EBBA)
+            OperationRegion (EBDA, SystemMemory, EBBA, 0x0400)
 
             Field (EBDA, AnyAcc, NoLock, Preserve) {
                         AccessAs (ByteAcc, 0x00), 
@@ -347,29 +361,9 @@
             }
 
 //          Store (QQE1, Local0)
-//          Multiply (Local0, 0x0400, ZZY5)  // Unused
-            Store (QQE2, ZZY6)
-//    VSAW(0, 1)
+            Store (QQE2, MEMK)
         }
 
-        OperationRegion (GPIO, SystemIO, 0x1000, 0x0100)
-        Field (GPIO, DWordAcc, NoLock, Preserve) {
-//                    Offset (0x38), 
-//            GLEE,   32
-                    Offset (0xA4),
-            GHIN,   32,               // High bank Input Invert
-                    Offset (0xB0),    // High bank read back
-                ,   10, 
-            LSWI,   1                 // Lid switch bit
-//                  Offset (0xB8),
-//          GHEE,   32                // High bank events enable
-//                  Offset (0xC0),
-//          GHPE,   32,               // High bank posedge enable
-//          GHNE,   32,               // High bank negedge enable
-//          GHPS,   32,               // High bank posedge status
-//          GHNS,   32,               // High bank negedge status
-        }
-
         Device (LNKA) {
             Name (_HID, EisaId ("PNP0C0F"))
             Name (_UID, One)
@@ -415,7 +409,7 @@
             {
                 If (LNot (Acquire (ACMX, 5000)))
                 {
-//                    UPUT (0x70)  // p
+//                  UPUT (0x70)  // p
                     Store (ECRD (0xFA40), Local0)
                     Release (ACMX)
                 }
@@ -430,8 +424,7 @@
                 }
             }
 
-//            Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) { Return (0x0F) }
+            Name (_STA, 0x0F)
         }
 
         // DDD geoderom has no battery stuff
@@ -468,14 +461,14 @@
             })
             Method (_STA, 0, NotSerialized)   // Battery Status
             {
-                If (LEqual (ZZY2, 0x03))
+                If (LEqual (SLPS, 0x03))
                 {
                     Return (0x0F)
                 }
 
                 If (LNot (Acquire (ACMX, 5000)))
                 {
-//                    UPUT (0x73)  // s
+//                  UPUT (0x73)  // s
                     Store (ECRD (0xFAA4), Local0)
                     Release (ACMX)
                 }
@@ -494,14 +487,14 @@
             {
                 If (LNot (Acquire (ACMX, 5000)))
                 {
-//                    UPUT (0x69)  // i
+//                  UPUT (0x69)  // i
                     Store (ECRD (0xFB5F), Local0)
                     Store (ECRD (0xF929), Local1)
                     Switch (Local0)
                     {
                         Case (0x11)
                         {
-//                            UPUT (0x42)  // B
+//                          UPUT (0x42)  // B
                             Store (3800, Index (BIFP, One))
                             Store (3000, Index (BIFP, 2))
                             Store (6000, Index (BIFP, 0x04))
@@ -513,11 +506,11 @@
                             Store ("NiMH (GP) ", Index (BIFP, 9))
                             Store ("", Index (BIFP, 10))
                             Store ("GoldPeak ", Index (BIFP, 0x0C))
-//                            UPUT (0x62)  // b
+//                          UPUT (0x62)  // b
                         }
                         Case (0x12)
                         {
-//                            UPUT (0x44)  // D
+//                          UPUT (0x44)  // D
                             Store (3000, Index (BIFP, One))
                             Store (2800, Index (BIFP, 2))
                             Store (6000, Index (BIFP, 4))
@@ -529,11 +522,11 @@
                             Store ("LiFePO4 (GP) ", Index (BIFP, 9))
                             Store ("", Index (BIFP, 10))
                             Store ("GoldPeak ", Index (BIFP, 0x0C))
-//                            UPUT (0x64)  // d
+//                          UPUT (0x64)  // d
                         }
                         Case (0x22)
                         {
-//                            UPUT (0x43)  // C
+//                          UPUT (0x43)  // C
                             Store (3550, Index (BIFP, One))
                             Store (3100, Index (BIFP, 2))
                             Store (6500, Index (BIFP, 4))
@@ -545,7 +538,7 @@
                             Store ("LiFePO4 (BYD) ", Index (BIFP, 9))
                             Store ("", Index (BIFP, 10))
                             Store ("BYD ", Index (BIFP, 0x0C))
-//                            UPUT (0x63)  // c
+//                          UPUT (0x63)  // c
                         }
                     }
 
@@ -556,11 +549,11 @@
                     }
                     Else
                     {
-//x                        Store ("LiON", Index (BIFP, 11))
+//x                     Store ("LiON", Index (BIFP, 11))
                         Store ("LiFePO4", Index (BIFP, 11))
                     }
 
-//x                    Store ("OLPC ", Index (BIFP, 0x0C))
+//x                 Store ("OLPC ", Index (BIFP, 0x0C))
                     Release (ACMX)
                 }
 
@@ -571,7 +564,7 @@
             {
                 If (LNot (Acquire (ACMX, 5000)))
                 {
-//                    UPUT (0x74)  // t
+//                  UPUT (0x74)  // t
                     If (And (ECRD (0xFAA5), One))
                     {
                         Store (0x02, Local1)  // charging
@@ -618,43 +611,34 @@
             }
         }
 
-// XXX ??? Need battery device with static and dynamic info
-
         Device (LIDS) {
             Name (_HID, EisaId ("PNP0C0D"))
             Name (_PRW, Package (0x02) {  0x1e, 0x03 })            // Event 1e, wakes from S3
-            Method (_INI, 0, NotSerialized) {
-                Store (0x400, GHIN)               // Turn on invert to see falling edge
-            }
             Method (_LID, 0, NotSerialized) {
-                // The expected state is LSWI == 1, because the inverter is either
-                // on or off depending on the previous state.
-                // If LSWI == 0, it means that the switch changed values then
-                // changed back to the previous state.
-//                UPUT (0x6c)                       // l
-                If (LSWI) {
-                    If (And(GHIN, 0x400))
-                    {                                     // Inverted, became closed
-//                        UPUT (0x30)
-                        Store (0x4000000, GHIN)           // Turn on invert to see falling edge
-                        Store (Zero, Local0)
-                    } Else {                              // Not inverted, became open
-//                        UPUT (0x31)
-                        Store (0x400, GHIN)               // Turn on invert to see falling edge
-                        Store (One, Local0)
-                    }
-                } Else {                                  // Spurious event
-                    If (And(GHIN, 0x400))
-                    {                                     // Inverted, stayed open
-                        Store (One, Local0)
-//                        UPUT (0x61)
-                    } Else {
-                        Store (Zero, Local0)
-//                        UPUT (0x62)
-                    }
+//              UPUT (0x6c)                   // l
+                Store (0x4000000, GHEE)       // Disable events during readback
+
+                Store (0x4000000, GHNE)       // Select readback port ..
+                Store (0x4000000, GHPE)       // by setting the multiplexor to 00
+                Stall (100)                   // Give the signal three 32 kHz clock times to propate 
+                Store (    0x400, GHNS)       // Clear lid negative status
+                Store (    0x400, GHPS)       // Clear lid positive status
+
+                If (LSWI) {                   // Lid is open
+                    Store (One, Local0)       // Report open
+                } Else {
+                    Store (Zero, Local0)      // Report closed
                 }
-//                UPUT (0x20)
 
+                // The only time that we are interested in the lid opening event
+                // is when we are asleep, i.e. just after the _PTS event, so it
+                // suffices to always setup for the closing event herein, leaving
+                // _PTS to flip the state to look for the lid-opening edge
+                Store (    0x400, GHNE)       // Look for lid closing
+                Store (0x4000000, GHPE)       // .. not lid opening
+
+                Stall (100)                   // Give the signal three 32 kHz clock times to propate
+                Store (0x400, GHEE)           // Enable events
                 Return (Local0)
             }
         }
@@ -664,8 +648,8 @@
             Name (_ADR, Zero)
 
             // XXX Probably should be sleep state 0 - can't wake from PCI as power is off
-//            Name (_PRW, Package (0x02) { 0x1f, 0x05 })
-// XXX        Name (_PRW, Package (0x02) { 0x1f, 0x03 })
+//          Name (_PRW, Package (0x02) { 0x1f, 0x05 })
+// XXX      Name (_PRW, Package (0x02) { 0x1f, 0x03 })
 
 //            Name (_STA, 0x0F)
 Method (_STA, 0, NotSerialized) { Return (0x0F) }
@@ -713,9 +697,9 @@
                     0x00000000, 0x000A0000, 0x000BFFFF, 0x00000000, 0x00020000,
                     ,, , AddressRangeMemory, TypeStatic)
 
-//                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
-//                    0x00000000, 0x000C0000, 0x000DFFFF, 0x00000000, 0x00020000,
-//                    ,, , AddressRangeMemory, TypeStatic)
+//              DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+//                  0x00000000, 0x000C0000, 0x000DFFFF, 0x00000000, 0x00020000,
+//                  ,, , AddressRangeMemory, TypeStatic)
 
                 DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
                     0x00000000, 0x000C8000, 0x000DFFFF, 0x00000000, 0x00018000,
@@ -724,18 +708,18 @@
 
 // This is a template, edited by _CRS, for the address space that PCI claims between the top of main memory and
 // the bottom of (SMM memory)?.
-//                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
-//                    0x00000000, 0x04000000, 0x403FFFFF, 0x00000000, 0x3C400000,
-//                    ,, _Y04, AddressRangeMemory, TypeStatic)
+//              DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+//                  0x00000000, 0x04000000, 0x403FFFFF, 0x00000000, 0x3C400000,
+//                  ,, _Y04, AddressRangeMemory, TypeStatic)
 
 // This is a template, edited by _CRS, for the address space that PCI claims abover the top of SMM memory
-//                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
-//                    0x00000000, 0x40500000, 0xEFFFFFFF, 0x00000000, 0xAFB00000,
-//                    ,, _Y05, AddressRangeMemory, TypeStatic)
+//              DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+//                  0x00000000, 0x40500000, 0xEFFFFFFF, 0x00000000, 0xAFB00000,
+//                  ,, _Y05, AddressRangeMemory, TypeStatic)
 
-//                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
-//                    0x00000000, 0xB0000000, 0xbfFFFFFF, 0x00000000, 0x10000000,
-//                    ,, , AddressRangeMemory, TypeStatic)
+//              DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+//                  0x00000000, 0xB0000000, 0xbfFFFFFF, 0x00000000, 0x10000000,
+//                  ,, , AddressRangeMemory, TypeStatic)
 
 // Since we can't plug in PCI devices, there is no need for an allocation pool of PCI address space
 // We just declare a modest amount of PCI space and preassign device addresses in the firmware
@@ -743,28 +727,12 @@
                     0x00000000, 0xfd000000, 0xfeFFFFFF, 0x00000000, 0x02000000,
                     ,, , AddressRangeMemory, TypeStatic)
 
-//                DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
-//                    0x00000000, 0xF0000000, 0xFEFFFFFF, 0x00000000, 0x0f000000,
-//                    ,, , AddressRangeMemory, TypeStatic)
+//              DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite,
+//                  0x00000000, 0xF0000000, 0xFEFFFFFF, 0x00000000, 0x0f000000,
+//                  ,, , AddressRangeMemory, TypeStatic)
 
             })
             Method (_CRS, 0, NotSerialized) {
-//    VSAW(0, 2)
-//                CreateDWordField (CRES, \_SB.PCI0._Y04._MIN, RMIN)
-//                CreateDWordField (CRES, \_SB.PCI0._Y04._MAX, RMAX)
-//                CreateDWordField (CRES, \_SB.PCI0._Y04._LEN, RLEN)
-//                CreateDWordField (CRES, \_SB.PCI0._Y05._MIN, PMIN)
-//                CreateDWordField (CRES, \_SB.PCI0._Y05._MAX, PMAX)
-//                CreateDWordField (CRES, \_SB.PCI0._Y05._LEN, PLEN)
-//                Store (ZZY6, Local0)             // size from EBDA[0x180]
-//                Add (Local0, 0x40, Local0)       // + 64
-//                ShiftLeft (Local0, 0x0A, RMIN)   // * 1024 -> RMIN above
-//                Subtract (0x80400000, One, RMAX) // 803f.ffff -> RMAX above
-//                Subtract (RMAX, RMIN, Local1)
-//                Increment (Local1)
-//                Store (Local1, RLEN)                   // -> RLEN above
-//                Add (0x80400000, 0x00100000, PMIN)     // -> PMIN
-//                Add (Subtract (PMAX, PMIN), One, PLEN) // -> PLEN
                 Return (CRES)
             }
 
@@ -772,18 +740,13 @@
                 Name (_ADR, 0x000F0000)                          // PCI dev F, fn 0
                 Method (_INI, 0, NotSerialized) {
   ^^^_INI () 
-//    VSAW(0, 3)
 }  // Call root _INI ?  Parent: PCI0 Grandparent: system bus
 
                 Device (RTC0) {
-//   Method (_INI, 0, NotSerialized) { VSAW(1, 0x55) }
 
                     Name (_HID, EisaId ("PNP0B00"))
                     Name (_UID, Zero)
-//                    Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(1, 0x56)
- Return (0x0F) }
+                    Name (_STA, 0x0F)
 
                     Name (_CRS, ResourceTemplate () {
                         IRQNoFlags () {8}
@@ -792,12 +755,8 @@
                 }
 
                 Device (TMR) {
-//   Method (_INI, 0, NotSerialized) { VSAW(2, 0x55) }
                     Name (_HID, EisaId ("PNP0100"))
-//                    Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(2, 0x56)
- Return (0x0F) }
+                    Name (_STA, 0x0F)
                     Name (_CRS, ResourceTemplate () {
                         IRQNoFlags () {0}
                         IO (Decode16, 0x0040, 0x0040, 0x00, 0x04, )
@@ -807,14 +766,10 @@
 
 // Elided speaker
 
-// XXX ??? Do we need to reinstate this MEM node???
-
                 Device (MEM) {
-//   Method (_INI, 0, NotSerialized) { VSAW(3, 0x55) }
                     Name (_HID, EisaId ("PNP0C01"))
                     Name (_UID, One)
                     Method (_CRS, 0, NotSerialized) {
-// VSAW(0, 4)
                         Name (MBRB, ResourceTemplate () {
                             Memory32Fixed (ReadWrite, 0x00000000, 0x000A0000, )
                             Memory32Fixed (ReadOnly,  0x000E0000, 0x00020000, )
@@ -826,7 +781,7 @@
                             IO (Decode16, 0x0092, 0x0092, 0x00, 0x01, )
                         })
                         CreateDWordField (MBRB, \_SB.PCI0.SBF0.MEM._CRS._Y06._LEN, EM1L)
-                        Store (ZZY6, Local0)                // Memory size in Kbytes (from EBDA)
+                        Store (MEMK, Local0)                // Memory size in Kbytes (from EBDA)
                         Subtract (Local0, 0x0400, Local0)   // Subtract 1024 (for below 1M mem)
                         ShiftLeft (Local0, 0x0A, Local0)    // Multiply by 1K to convert to bytes
                         Store (Local0, EM1L)                // Punch into the data structure
@@ -836,12 +791,8 @@
 
                 Device (PIC)
                 {
-//   Method (_INI, 0, NotSerialized) { VSAW(4, 0x55) }
                     Name (_HID, EisaId ("PNP0000"))
-//                    Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(4, 0x56)
- Return (0x0F) }
+                    Name (_STA, 0x0F)
                     Name (_CRS, ResourceTemplate () {
                         IRQNoFlags () {2}
                         IO (Decode16, 0x0020, 0x0020, 0x00, 0x02, )
@@ -852,12 +803,8 @@
 
                 Device (MAD)
                 {
-//   Method (_INI, 0, NotSerialized) { VSAW(5, 0x55) }
                     Name (_HID, EisaId ("PNP0200"))
-//                    Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(5, 0x56)
- Return (0x0F) }
+                    Name (_STA, 0x0F)
                     Name (_CRS, ResourceTemplate () {
                         DMA (Compatibility, BusMaster, Transfer8, ) {4}
                         IO (Decode16, 0x0000, 0x0000, 0x10, 0x10, )
@@ -868,7 +815,6 @@
                 }
 
                 Device (COPR) {
-//   Method (_INI, 0, NotSerialized) { VSAW(6, 0x55) }
                     Name (_HID, EisaId ("PNP0C04"))
                     Name (_CRS, ResourceTemplate () {
                         IO (Decode16, 0x00F0, 0x00F0, 0x10, 0x10, )
@@ -882,41 +828,31 @@
 
 // XXX ??? Maybe this should be moved out a level so it's not under SB F0
                 Device (KBC) {
-//   Method (_INI, 0, NotSerialized) { VSAW(7, 0x55) }
                     Name (_HID, EisaId ("PNP0303"))
                     Name (_CID, 0x0B03D041)
 
                     // Return this one if can wake from keyboard - XXX maybe need to be 3 instead of One
                     Name (_PRW, Package (0x02) { Zero, One })
 
-// XXX ??? do we need a _PSW method?
-                Method (_PSW, 1, NotSerialized) { }
+                    Method (_PSW, 1, NotSerialized) { }
 
-                    // XXX Can we control whether or not the keyboard can wake us up?
+                    // Q: Can we control whether or not the keyboard can wake us up?
+                    // A: Yes, via EC commands.  But we choose not to for now.
                     Name (_CRS, ResourceTemplate () {
                         IRQNoFlags () {1}
                         IO (Decode16, 0x0060, 0x0060, 0x00, 0x01, )
                         IO (Decode16, 0x0064, 0x0064, 0x00, 0x01, )
                     })
-//                    Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(7, 0x56)
- Return (0x0F) }
+                    Name (_STA, 0x0F)
                 }
 
                 Device (PS2M) {
-//   Method (_INI, 0, NotSerialized) { VSAW(0xc, 0x55) }
-//                    Name (_HID, EisaId ("PNP0F13"))     // Microsoft Intellipoint
                     Name (_HID, EisaId ("PNP0F03"))     // ALPS Pointing device
                     Name (_CID, 0x130FD041)
                     Name (_PRW, Package (0x02) { Zero, One })
-// XXX ??? do we need a _PSW method?
                     Method (_PSW, 1, NotSerialized) { }
                     Name (_CRS, ResourceTemplate () { IRQNoFlags () {12} })
-//                    Name (_STA, 0x0F )
-Method (_STA, 0, NotSerialized) {
-// VSAW(0xc, 0x56)
- Return (0x0F) }
+                    Name (_STA, 0x0F )
                 }
 // Elided FDC0
 // Elided SuperIO UART
@@ -925,37 +861,27 @@
             }
 
             Device (USB0) {
-//   Method (_INI, 0, NotSerialized) { VSAW(8, 0x55) }
                 Name (_ADR, 0x000F0004)
                 Name (_STR, Unicode ("CS553x USB Controller 0"))
-//                Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(8, 0x56)
- Return (0x0F) }
+                Name (_STA, 0x0F)
 
                 Name (_PRW, Package (0x02) { 0x06, One })
             }
 
             Device (USB1) {
-//   Method (_INI, 0, NotSerialized) { VSAW(9, 0x55) }
                 Name (_ADR, 0x000F0005)
                 Name (_STR, Unicode ("CS553x USB Controller 1"))
-//                Name (_STA, 0x0F)
-Method (_STA, 0, NotSerialized) {
-// VSAW(9, 0x56)
- Return (0x0F) }
+                Name (_STA, 0x0F)
                 Name (_PRW, Package (0x02) { 0x06, One })
             }
 
 //            Device (USB2) {
-//   Method (_INI, 0, NotSerialized) { VSAW(0xa, 0x55) }
 //                Name (_ADR, 0x000F0006)
 //                Name (_STR, Unicode ("CS5536 USB Controller 2 (UDC)"))
 //                Name (_STA, 0x0F)
 //            }
 
 //            Device (USB3) {
-//   Method (_INI, 0, NotSerialized) { VSAW(0xb, 0x55) }
 //                Name (_ADR, 0x000F0007)
 //                Name (_STR, Unicode ("CS5536 USB Controller 3 (OTG)"))
 //                Name (_STA, 0x0F)

Modified: cpu/x86/pc/olpc/fw.bth
===================================================================
--- cpu/x86/pc/olpc/fw.bth	2009-01-07 09:14:26 UTC (rev 1067)
+++ cpu/x86/pc/olpc/fw.bth	2009-01-09 06:08:34 UTC (rev 1068)
@@ -344,6 +344,7 @@
 fload ${BP}/cpu/x86/pc/olpc/smbios.fth
 \ fload ${BP}/cpu/x86/pc/biosload/rmenter.fth
 fload ${BP}/cpu/x86/pc/biosints.fth
+fload ${BP}/cpu/x86/pc/olpc/biosresume.fth
 
 fload ${BP}/cpu/x86/pc/olpc/setwp.fth
 fload ${BP}/cpu/x86/pc/olpc/security.fth

Modified: dev/geode/smi.fth
===================================================================
--- dev/geode/smi.fth	2009-01-07 09:14:26 UTC (rev 1067)
+++ dev/geode/smi.fth	2009-01-09 06:08:34 UTC (rev 1068)
@@ -783,6 +783,12 @@
    enable-io-smis
 ;
 
+defer suspend-devices  ' noop to suspend-devices
+defer resume-devices   ' noop to resume-devices
+
+defer freeze-ps2  ' noop to freeze-ps2
+defer unfreeze-ps2  ' noop to unfreeze-ps2
+
 \ Implement the ACPI S3 (suspend to RAM) semantics using the OFW
 \ "S3 looks like a subroutine call" semantics.  This requires
 \ some fancy mode switching.
@@ -794,13 +800,13 @@
    resume-debug?  if  debug-me  then
    exit-smi
    resume-debug?  if  ." enter s3" cr  then 
-   dcon-power-off
-   wlan-freeze
+
+   suspend-devices
+
    s3
-   wlan-reset
-   dcon-power-on
-   d# 10 ms
-   " dcon-restart" screen-ih $call-method
+
+   resume-devices
+
 \   ." Return from S3" cr  interact
 \   noop
    setup-smi




More information about the openfirmware mailing list