[openfirmware] r1230 - cpu/x86/pc/olpc/via dev/olpc/dcon

svn at openfirmware.info svn at openfirmware.info
Tue Jun 30 21:53:14 CEST 2009


Author: wmb
Date: 2009-06-30 21:53:14 +0200 (Tue, 30 Jun 2009)
New Revision: 1230

Modified:
   cpu/x86/pc/olpc/via/acpi.fth
   cpu/x86/pc/olpc/via/addrs.fth
   cpu/x86/pc/olpc/via/dsdt.dsl
   cpu/x86/pc/olpc/via/fw.bth
   cpu/x86/pc/olpc/via/ioinit.fth
   cpu/x86/pc/olpc/via/rmstart.fth
   cpu/x86/pc/olpc/via/romreset.bth
   dev/olpc/dcon/viadcon.fth
Log:
Via - ACPI wakeup support.


Modified: cpu/x86/pc/olpc/via/acpi.fth
===================================================================
--- cpu/x86/pc/olpc/via/acpi.fth	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/acpi.fth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -232,6 +232,44 @@
    dup >acpi-table-len  9  fix-checksum
 ;
 
+h# 28 constant rm-ds     \ Must agree with GDT in rmstart.fth
+
+label do-acpi-wake
+   \ This code must be copied to low memory
+   \ Jump to this code (in low memory) with the linear target address in EAX
+   \ Interrupts must be off.  We don't have a stack.
+   \ We got here via a far jmp to a 16-bit code segment, so we are
+   \ using the 16-bit instruction set, but we're not yet in real mode
+
+   16-bit
+
+   ahead
+      0 w, 0 w,   \ Room for the segment:offset pointer
+   then
+
+   op: ax bx mov
+   h# 0f # ax and
+   op: 4 # bx shr
+
+   cs: ax  wake-adr la1+ #)  mov  \ Offset
+   cs: bx  wake-adr wa1+ #)  mov  \ Segment
+
+   \ The following might be unnecessary
+   ax ax xor  rm-ds #  al  mov  \ 16-bit data segment
+   ax ds mov  ax es mov  ax ss mov
+
+   cr0 ax mov   h# fe # al and   ax cr0 mov   \ Enter real mode
+
+   here 5 +  do-acpi-wake -  wake-adr  + >seg:off #)  far jmp  \ Jump to set cs
+
+   \ The following might be unnecessary
+   \ Now we are running in real mode; fix segments again
+   cs ax mov   ax ds mov  ax es mov
+
+   cs:  wake-adr wa1+  s#)  far jmp
+end-code
+here do-acpi-wake - constant /do-acpi-wake
+
 : setup-acpi  ( -- )
 [ifdef] notdef
    \ This has to agree with the _SB's _INI method, which gets the memory size
@@ -254,6 +292,8 @@
    " dsdt" find-drop-in  0= abort" No DSDT "  ( adr len )
    2dup dsdt-adr swap  move  free-mem
 
+   do-acpi-wake wake-adr 4 +   /do-acpi-wake  move
+
 [ifdef] notdef
    \ Copy in the SSDT
    \ I suppose we could point to it in FLASH - if so don't compress it,

Modified: cpu/x86/pc/olpc/via/addrs.fth
===================================================================
--- cpu/x86/pc/olpc/via/addrs.fth	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/addrs.fth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -69,12 +69,13 @@
 h# e0080 constant fadt-adr
 h# e0180 constant facs-adr
 h# e01c0 constant dbgp-adr
-h# e0200 constant madt-adr  \ MADT is 5a byts long
+h# e0200 constant madt-adr  \ MADT is 5a bytes long
 h# e0280 constant hpet-adr
 h# fc000 constant dsdt-adr
 h# fd000 constant ssdt-adr
 
 h# ffc00 constant smbios-adr
+h# fff00 constant wake-adr
 
 h#  3e.0000 constant inflate-base
 h#  30.0000 constant workspace

Modified: cpu/x86/pc/olpc/via/dsdt.dsl
===================================================================
--- cpu/x86/pc/olpc/via/dsdt.dsl	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/dsdt.dsl	2009-06-30 19:53:14 UTC (rev 1230)
@@ -22,6 +22,14 @@
 {
     Processor(\_PR.CPU0,0x00,0x00000410,0x06)
     {
+       Name(_CST, Package()
+       {
+           4,
+           Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x414)}, 2,   2, 750},
+           Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x415)}, 3,  65, 500},
+           Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x416)}, 4, 100, 300},
+           Package(){ResourceTemplate(){Register(SystemIO, 8, 0, 0x417)}, 5, 200, 200}
+       })
     }
 }    
     // System Sleep States

Modified: cpu/x86/pc/olpc/via/fw.bth
===================================================================
--- cpu/x86/pc/olpc/via/fw.bth	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/fw.bth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -344,12 +344,12 @@
    boot-getline to boot-file   " rom:emacs" $boot
 ;
 
+fload ${BP}/cpu/x86/pc/rmtools.fth
 fload ${BP}/cpu/x86/pc/olpc/via/acpi.fth
 
 fload ${BP}/cpu/x86/pc/olpc/via/smbios.fth
 
 [ifdef] Later
-fload ${BP}/cpu/x86/pc/rmtools.fth
 fload ${BP}/dev/geode/smi.fth
 \ fload ${BP}/cpu/x86/pc/biosload/rmenter.fth
 fload ${BP}/cpu/x86/pc/biosints.fth

Modified: cpu/x86/pc/olpc/via/ioinit.fth
===================================================================
--- cpu/x86/pc/olpc/via/ioinit.fth	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/ioinit.fth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -199,7 +199,8 @@
    82 0f 0a mreg  \ Direct SCI to IRQ 10 (0xa)
    84 ff da mreg  \ IRQs 7,6,4,3,1 are primary wakeups
    85 ff 40 mreg  \ IRQ 14 is primary wakeup
-   8a 9f 1f mreg  \ C-state auto switching with normal latencies
+\  8a 9f 1f mreg  \ C-state auto switching with normal latencies
+   8a 9f 9f mreg  \ C-state auto switching with slow C4 recovery mode - for C4 support
 [ifdef] demo-board
    8d 18 18 mreg  \ fast clock as throttle timer tick, hold SMI# low until event status cleared (FIXME for OLPC)
 [then]

Modified: cpu/x86/pc/olpc/via/rmstart.fth
===================================================================
--- cpu/x86/pc/olpc/via/rmstart.fth	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/rmstart.fth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -39,9 +39,8 @@
 \ 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.fc00:  GDT  ( 4 active entries ) + padding
+\ ffff.fc30:  Startup code plus padding
 \ ffff.fff0:  Reset entry point - jump to startup code plus padding to end
 
 \ Assembler macros for startup diagnostics
@@ -88,10 +87,12 @@
    0    w,  0         l,	 0      w,  \ * 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 w,  9b.0f0000 l,  00.0.0 w,  \ 20 Code16, base f.0000, 64K
+   ffff w,  93.0f0000 l,  00.0.0 w,  \ 28 Data16, base f.0000, 64K
 
    \ ------->>>>> Startup code, reached by branch from main entry point below
    \
-   \ ffff.fc20
+   \ ffff.fc30
 
    here		\ Mark the beginning of this code so its size may be determined
 		\ and so that a jump to it may be assembled later.
@@ -170,8 +171,8 @@
 
    here over -   ( adr , size-of-preceding-code )
 
-   \ ffff.fc20 is the location of the code that follows the GDT
-   ffff.fff0 ffff.fc20 - swap - ( address #bytes-to-pad )
+   \ ffff.fc30 is the location of the code that follows the GDT
+   ffff.fff0 ffff.fc30 - 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.
@@ -187,7 +188,7 @@
 
    16-bit
    cli cld		\ Turn off interrupts (does not affect NMI)
-   #) jmp		\ Relative jump back to ffff.fc20
+   #) jmp		\ Relative jump back to ffff.fc30
    0 w, 0 c,		\ align "pad" to end of ROM
    loader-version# l,	\ version#
    loader-format#  w,	\ "format" (>1 when crc present)

Modified: cpu/x86/pc/olpc/via/romreset.bth
===================================================================
--- cpu/x86/pc/olpc/via/romreset.bth	2009-06-29 19:30:06 UTC (rev 1229)
+++ cpu/x86/pc/olpc/via/romreset.bth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -11,7 +11,10 @@
 
 \needs start-assembling  fload ${BP}/cpu/x86/asmtools.fth
 \needs write-dropin      fload ${BP}/forth/lib/mkdropin.fth
+\needs >seg:off          fload ${BP}/cpu/x86/pc/rmtools.fth
 
+h# 20 constant rm-cs     \ Must agree with GDT in rmstart.fth
+
 fload ${BP}/cpu/x86/mmuparam.fth
 
 \ startmacros.fth defines some assembler macros that make MSR and I/O port
@@ -170,12 +173,21 @@
       bx ax mov  h# 1c00 invert # ax and  acpi-io-base 4 + # dx mov  op: ax dx out
       char r report
 
-      resume-data  # sp mov
-      resume-entry # ax mov  ax call   \ This might return if checksumming fails
+      cli
+
+      facs-adr h# c + #) ax mov  ax ax or  0<>  if
+         \ Resume in real mode for ACPI operating systems
+         \ Linear wakeup address is in EAX
+         sp sp xor  \ Possibly unnecessary
+         wake-adr >seg:off drop  rm-cs #) far jmp
+      else
+         \ Resume in 32-bit protected mode for OFW
+         resume-data  # sp mov
+         resume-entry # ax mov  ax call   \ This might return if checksumming fails
+      then
       char x report
    then                                            \ Not a wakeup from S3
 
-
    \ Cache is now setup normally, backed by memory
    h# 20.0000 # esp mov
 

Modified: dev/olpc/dcon/viadcon.fth
===================================================================
--- dev/olpc/dcon/viadcon.fth	2009-06-29 19:30:06 UTC (rev 1229)
+++ dev/olpc/dcon/viadcon.fth	2009-06-30 19:53:14 UTC (rev 1230)
@@ -83,7 +83,7 @@
       d# 50 ms
       wait-output
       dcon-load  \ Put the DCON in VGA-refreshed mode
-      d# 25 us
+      d# 25 ms   \ Ensure that that DCON sees the DCONLOAD high
 \      display-on
    else
       dcon-unload  \ Put the DCON in self-refresh mode




More information about the openfirmware mailing list