[openfirmware] r1225 - cpu/x86 cpu/x86/pc cpu/x86/pc/olpc/via ofw/inet
svn at openfirmware.info
svn at openfirmware.info
Fri Jun 26 18:10:47 CEST 2009
Author: wmb
Date: 2009-06-26 18:10:47 +0200 (Fri, 26 Jun 2009)
New Revision: 1225
Added:
cpu/x86/pc/olpc/via/smbios.fth
Modified:
cpu/x86/apic.fth
cpu/x86/pc/apic.fth
cpu/x86/pc/olpc/via/acpi.fth
cpu/x86/pc/olpc/via/addrs.fth
cpu/x86/pc/olpc/via/config.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/versions.fth
ofw/inet/ip.fth
Log:
OLPC q3a04 - ACPI and SMBIOS enabled, suspend/resume works from OFW.
Modified: cpu/x86/apic.fth
===================================================================
--- cpu/x86/apic.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/apic.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -44,9 +44,9 @@
: id! ( id -- ) d# 24 lshift d# 20 apic! ;
: id@ ( -- id ) d# 20 apic@ d# 24 rshift ;
: lvt0@ ( -- n ) h# 350 apic@ ;
-: lvt0! ( n -- ) h# 350 apic@ ;
+: lvt0! ( n -- ) h# 350 apic! ;
: lvt1@ ( -- n ) h# 360 apic@ ;
-: lvt1! ( n -- ) h# 360 apic@ ;
+: lvt1! ( n -- ) h# 360 apic! ;
: lvt0-disable-irq ( -- ) h# 10000 h# 350 apic-set ; \ Disable LINT0
: lvt0-enable-irq ( -- ) h# 10000 h# 350 apic-clr ; \ Enable LINT0
@@ -148,6 +148,8 @@
: open ( -- okay? )
io-apic-base 0= if
io-apic-mmio-base h# 80 " map-in" $call-parent to io-apic-base
+ 1 d# 24 lshift 0 io-apic! \ I/O APIC ID
+ 1 3 io-apic! \ Front side bus message delivery
then
true
;
Modified: cpu/x86/pc/apic.fth
===================================================================
--- cpu/x86/pc/apic.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/apic.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -123,10 +123,10 @@
20 0
30 50014
-80 f0
+80 f0 (00)
d0 0
e0 ffffffff
-f0 10f
+f0 10f (1ff) Spurious vector number
320 10000 Timer Masked off
340 10000 PCINT Masked off
350 700 LINT0 vector 0 mode ExtINT (111) Edge Trigger Active High
@@ -164,7 +164,7 @@
indirect io apic regs
00 1000000 IOAPIC ID is 1
01 178003 (RO) version
-02 1000000 Arb ID is 1
+02 1000000 (RO) Arb ID is 1
03 1 Front side bus message delivery
10,11 0100.0000 . 0001.0000 DD00 . 0000 . 000 ooom . tips MVV
..
Modified: cpu/x86/pc/olpc/via/acpi.fth
===================================================================
--- cpu/x86/pc/olpc/via/acpi.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/acpi.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -2,9 +2,13 @@
h# 0. 2constant xsdt-adr
+: set-acpi-table-length ( table-adr -- )
+ here over - swap la1+ l!
+;
+
create fadt
( 000 4 ) " FACP" $, \ Signature
-( 004 4 ) h# 84 l, \ Table Length
+( 004 4 ) h# 84 l, \ Length
( 008 1 ) h# 02 c, \ Revision (supports reset adr)
( 009 1 ) h# 00 c, \ Checksum
( 00A 6 ) " OLPC " $, \ Oem ID
@@ -27,24 +31,22 @@
( 037 1 ) h# 00 c, \ P-State Control
( 038 4 ) h# 400 l, \ PM1A Event Block Address
( 03C 4 ) h# 0 l, \ PM1B Event Block Address
-\ ( 040 4 ) h# 9c28 l, \ PM1A Control Block Address
( 040 4 ) h# 404 l, \ PM1A Control Block Address
( 044 4 ) h# 0 l, \ PM1B Control Block Address
-( 048 4 ) h# 0 l, \ PM2 Control Block Address (don't support)
-\ ( 04C 4 ) h# 9c10 l, \ PM Timer Block Address
+( 048 4 ) h# 22 l, \ PM2 Control Block Address
( 04C 4 ) h# 408 l, \ PM Timer Block Address
( 050 4 ) h# 420 l, \ GPE0 Block Address
( 054 4 ) h# 0 l, \ GPE1 Block Address
( 058 1 ) h# 4 c, \ PM1 Event Block Length
( 059 1 ) h# 2 c, \ PM1 Control Block Length
-( 05A 1 ) h# 0 c, \ PM2 Control Block Length
+( 05A 1 ) h# 1 c, \ PM2 Control Block Length
( 05B 1 ) h# 4 c, \ PM Timer Block Length
( 05C 1 ) h# 4 c, \ GPE0 Block Length
( 05D 1 ) h# 0 c, \ GPE1 Block Length
( 05E 1 ) h# 10 c, \ GPE1 Base Offset
( 05F 1 ) h# 85 c, \ _CST Support
-( 060 2 ) h# 1 w, \ C2 Latency
-( 062 2 ) h# 1 w, \ C3 Latency
+( 060 2 ) d# 10 w, \ C2 Latency (guess)
+( 062 2 ) d# 100 w, \ C3 Latency (guess)
( 064 2 ) h# 0 w, \ CPU Cache Size
( 066 2 ) h# 0 w, \ Cache Flush Stride
( 068 1 ) h# 0 c, \ Duty Cycle Offset
@@ -59,37 +61,24 @@
( 080 1 ) h# 1 c, \ Reset value
( 081 3 ) 0 c, 0 c, 0 c, \ Reserved
-here fadt - constant /fadt
+fadt set-acpi-table-length
\ FADT Flags:
\ WBINVD is operational : 1
\ WBINVD does not invalidate : 0
\ All CPUs support C1 : 1
\ C2 works on MP system : 0
-\ Power button is generic : 0
-\ Sleep button is generic : 1
+\ Power button is generic : 0 ??
+\ Sleep button is generic : 1 ??
\ RTC wakeup not fixed : 0
\ RTC wakeup/S4 not possible : 1
\ 32-bit PM Timer : 1
\ Docking Supported : 0
\ Reset Register Supported: 1
-create rsdp
-( 00 8 ) " RSD PTR " $, \ Signature
-( 08 1 ) 00 c, \ Checksum
-( 09 6 ) " OLPC " $, \ Oem Id
-( 0f 1 ) 2 c, \ ACPI revision (3.0b)
-( 10 4 ) rsdt-adr l, \ RSDT Address
-
-( 14 4 ) d# 36 l, \ Length for extended version
-( 18 8 ) xsdt-adr d, \ XSDT Address
-( 20 1 ) 0 c, \ extended checksum
-( 21 3 ) 0 c, 0 c, 0 c, \ reserved
-here rsdp - constant /rsdp
-
create madt \ Multiple APIC Descriptor Table
( 000 4 ) " APIC" $, \ Signature
-( 004 4 ) h# 5a l, \ Table Length
+( 004 4 ) h# 5a l, \ Length
( 008 1 ) h# 01 c, \ Revision
( 009 1 ) h# 00 c, \ Checksum
( 00A 6 ) " OLPC " $, \ Oem ID
@@ -106,7 +95,6 @@
( 02f 1 ) 0 c, \ ACPI ID
( 030 4 ) 1 l, \ Flags - 1 means this processor is usable
-
( 034 1 ) 1 c, \ I/O APIC
( 035 1 ) d# 12 c, \ length
( 036 1 ) 1 c, \ I/O APIC ID
@@ -133,11 +121,11 @@
( 053 1 ) 9 c, \ Bus-relative IRQ
( 054 4 ) 9 l, \ Interrupt # that this source will trigger
( 058 2 ) h# f w, \ Flags - active low, level triggered
-here madt - constant /madt
+madt set-acpi-table-length
create hpet \ High Precision Event Timer table
( 000 4 ) " HPET" $, \ Signature
-( 004 4 ) h# 38 l, \ Table Length
+( 004 4 ) h# 38 l, \ Length
( 008 1 ) h# 01 c, \ Revision
( 009 1 ) h# 00 c, \ Checksum
( 00A 6 ) " OLPC " $, \ Oem ID
@@ -155,13 +143,11 @@
( 034 1 ) 0 c, \ Sequence
( 035 2 ) 0 w, \ Min tick
( 037 1 ) 0 c, \ flags
-here hpet - constant /hpet
+hpet set-acpi-table-length
create rsdt
( 00 4 ) " RSDT" $, \ Signature
( 04 4 ) h# 34 l, \ Length
-\ ( 04 4 ) h# 30 l, \ Length
-\ ( 04 4 ) h# 2c l, \ Length
( 08 1 ) 1 c, \ Revision
( 09 1 ) 00 c, \ Checksum
( 0a 6 ) " OLPC " $, \ Oem Id
@@ -176,7 +162,7 @@
\ ( 2c 4 ) dbgp-adr l, \ DBGP Address
\ ( 30 4 ) ssdt-adr l, \ SSDT Address
\ ( 30 4 ) prtn-adr l, \ PRTN Address
-here rsdt - constant /rsdt
+rsdt set-acpi-table-length
0 [if]
create dbgp
@@ -192,7 +178,7 @@
( 24 1 ) 0 c, \ Full 16550 interface
( 25 3 ) 0 c, 0 c, 0 c, \ reserved
( 28 c ) 1 c, 8 c, 0 c, 1 c, h# 3f8 l, 0 l, \ Port base address (generic register descriptor)
-here dbgp - constant /dbgp
+dbgp set-acpi-table-length
[then]
create facs
@@ -205,8 +191,21 @@
( 18 8 ) 0. d, \ 64-bit waking vector
( 20 1 ) 1 c, \ Version
( 21 1f ) here d# 31 dup allot erase
-here facs - constant /facs
+facs set-acpi-table-length
+create rsdp
+( 00 8 ) " RSD PTR " $, \ Signature
+( 08 1 ) 00 c, \ Checksum
+( 09 6 ) " OLPC " $, \ Oem Id
+( 0f 1 ) 2 c, \ ACPI revision (3.0b)
+( 10 4 ) rsdt-adr l, \ RSDT Address
+
+( 14 4 ) d# 36 l, \ Length for extended version
+( 18 8 ) xsdt-adr d, \ XSDT Address
+( 20 1 ) 0 c, \ extended checksum
+( 21 3 ) 0 c, 0 c, 0 c, \ reserved
+here rsdp - constant /rsdp
+
: fix-checksum ( table /table checksum-offset -- )
>r over >r ( table /table r: cksum-offset table )
0 -rot bounds ?do i c@ + loop ( sum )
@@ -227,6 +226,12 @@
h# 1000 - \ Safety page
;
+: >acpi-table-len ( adr -- len ) la1+ l@ ;
+: copy-acpi-table ( src dst -- )
+ tuck over >acpi-table-len move ( dst )
+ dup >acpi-table-len 9 fix-checksum
+;
+
: setup-acpi ( -- )
[ifdef] notdef
\ This has to agree with the _SB's _INI method, which gets the memory size
@@ -234,14 +239,14 @@
memory-limit d# 10 rshift 'ebda h# 180 + l!
[then]
- \ Copy rsdt and fadt to low memory
+ \ Copy tables to low memory
+ fadt fadt-adr copy-acpi-table
+ madt madt-adr copy-acpi-table
+ hpet hpet-adr copy-acpi-table
+\ dbgp dbgp-adr copy-acpi-table
+ facs facs-adr facs >acpi-table-len move
+ rsdt rsdt-adr copy-acpi-table
rsdp rsdp-adr /rsdp move rsdp-adr h# 14 8 fix-checksum rsdp-adr /rsdp h# 20 fix-checksum
- rsdt rsdt-adr /rsdt move rsdt-adr /rsdt 9 fix-checksum
- fadt fadt-adr /fadt move fadt-adr /fadt 9 fix-checksum
- madt madt-adr /madt move madt-adr /madt 9 fix-checksum
- hpet hpet-adr /hpet move hpet-adr /hpet 9 fix-checksum
-\ dbgp dbgp-adr /dbgp move dbgp-adr /dbgp 9 fix-checksum
- facs facs-adr /facs move
\ Copy in the DSDT
\ I suppose we could point to it in FLASH - if so don't compress it,
@@ -261,10 +266,8 @@
h# ffffffff h# 20 acpi-l! \ Ack all leftover events
;
-.( Not setting up ACPI automatically) cr
stand-init: ACPI tables
-." Not setting up ACPI automatically" cr
-\ setup-acpi
+ setup-acpi
;
\ Geode h# 6000 constant xp-smbus-base
Modified: cpu/x86/pc/olpc/via/addrs.fth
===================================================================
--- cpu/x86/pc/olpc/via/addrs.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/addrs.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -74,6 +74,8 @@
h# fc000 constant dsdt-adr
h# fd000 constant ssdt-adr
+h# ffc00 constant smbios-adr
+
h# 3e.0000 constant inflate-base
h# 30.0000 constant workspace
Modified: cpu/x86/pc/olpc/via/config.fth
===================================================================
--- cpu/x86/pc/olpc/via/config.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/config.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -9,6 +9,7 @@
[ifdef] xo-board
create use-ec
[then]
+create use-apic
\ --- The environment that "boots" us ---
\ - Image Format - Example Media - previous stage bootloader
Modified: cpu/x86/pc/olpc/via/dsdt.dsl
===================================================================
--- cpu/x86/pc/olpc/via/dsdt.dsl 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/dsdt.dsl 2009-06-26 16:10:47 UTC (rev 1225)
@@ -18,10 +18,12 @@
Store (Arg1, CMSD)
}
// Processor Objects
- Scope(\_PR) {
- Processor(\_PR.CPU0,0x00,0x00000410,0x06){}
- }
-
+Scope(\_PR)
+{
+ Processor(\_PR.CPU0,0x00,0x00000410,0x06)
+ {
+ }
+}
// System Sleep States
Name(\_S0,Package(){0,0,0,0})
Name(\_S1,Package(){4,4,4,4})
@@ -888,13 +890,13 @@
ECDX, 2 //USB3 PM capability status register
}
- Method(_STA,0) { //Status of the USB3 Device
- If(LEqual(\_SB.PCI0.USB3.CMDR, 0x00)) {
- Return(0x0D)
- } Else {
- Return(0x0F)
- }
+ Method(_STA,0) { //Status of the USB3 Device
+ If(LEqual(\_SB.PCI0.USB3.CMDR, 0x00)) {
+ Return(0x0D)
+ } Else {
+ Return(0x0F)
}
+ }
}
@@ -904,7 +906,7 @@
Name(_PRW, Package(2){0x0E,3})
Name(_S3D, 3)
-
+
OperationRegion(U2F4,PCI_Config,0x00,0xC2)
Field(U2F4,ByteAcc,NoLock,Preserve){
Offset(0x00),
Modified: cpu/x86/pc/olpc/via/fw.bth
===================================================================
--- cpu/x86/pc/olpc/via/fw.bth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/fw.bth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -346,10 +346,11 @@
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/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
Modified: cpu/x86/pc/olpc/via/ioinit.fth
===================================================================
--- cpu/x86/pc/olpc/via/ioinit.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/ioinit.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -167,7 +167,7 @@
[then]
.( Check RTC century byte mapping to cmos 32 - see d17f0 rx58) cr
[ifdef] use-apic
- 58 40 40 mreg \ Enable Internal APIC
+ 58 40 40 mreg \ Enable Internal IO-APIC
[then]
[ifdef] xo-board
59 ff 1c mreg \ Keyboard (ports 60,64) and ports 62,66 on LPC bus (EC)
@@ -257,6 +257,9 @@
[ifdef] use-apic
e7 80 80 mreg \ Enable APIC Cycle Reflect to ALL Bus Master Activity Effective Signal
[then]
+[ifdef] xo-board
+ ec 04 00 mreg \ C3 state setting
+[then]
fc 06 04 mreg \ DPSLP# to SLP# Latency Adjustment - 22.5 us
end-table
@@ -278,7 +281,7 @@
\ 74 d8 08 mreg \ Lock Cycle Issued by CPU Blocks P2C Cycles (04 bit is reserved)
74 dc 0c mreg \ Lock Cycle Issued by CPU Blocks P2C Cycles - 04 res be like Phx
75 ff 0f mreg \ Use New grant mechanism for PCI arbitration, PCI Master Bus Timeout is 7x16 PCI clock
- 76 fd 50 mreg \ Enable PCI parking, Grant to CPU after 2 PC master grants
+ 76 fd d0 mreg \ Enable PCI parking, Grant to CPU after 2 PC master grants, support IO address 22 for C3
77 58 48 mreg \ PCI1 FIFO empty blocks CPU to PCI read, Read FIFO times out after 1 ms
80 07 07 mreg \ PCI1 and HDAC upstream read does not pass write, APCI blocks upstream write
\ 82 3e 20 mreg \ Monitor CCA and SDIO2
@@ -316,4 +319,6 @@
\ 00 to run - Axxxxx hits VGA in normal mode, hits shadow DRAM in SMM
\ 01 to access VGA when in SMM (data cycles only)
+\ acpi-io-base h# 26 + port-rb h# 07 bitset al dx out \ Settings to support C4 state
+acpi-io-base h# 26 + port-rb h# 06 bitset al dx out \ Settings to support C3 state
acpi-io-base h# 4c + port-rl h# 400 bitset ax dx out \ Set USB power high
Added: cpu/x86/pc/olpc/via/smbios.fth
===================================================================
--- cpu/x86/pc/olpc/via/smbios.fth (rev 0)
+++ cpu/x86/pc/olpc/via/smbios.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -0,0 +1,485 @@
+\ Make SMBIOS tables
+
+
+0 [if]
+h# ffbc0 constant 'pciirq
+\ http://www.microsoft.com/whdc/archive/pciirq.mspx
+\ create pciirq-header
+\ h# 52495024 l, \ $PIR
+\ h# 0100 w, \ version 1.0
+\ h# 0040 w, \ Total size
+\
+\ 0 c, 0 c, \ Bus#, DevFunc#
+\ 0 w, \ Exclusive IRQs
+\ 0 l, \ Compatible router
+\ 0 l, \ miniport data
+\ 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, \ res
+\ h# b0 c, \ checksum
+\ \ Table data goes here
+
+: make-pciirq-table ( -- )
+ 'pciirq h# 40 erase
+ h# 52495024 'pciirq l! \ $PIR
+ h# 0100 'pciirq la1+ w! \ version
+ h# 0040 'pciirq la1+ wa1+ w! \ total size
+ h# b0 'pciirq h# 1f + c! \ checksum
+ \ The rest of the table is 0 because the actual routing
+ \ is now done by ACPI
+;
+[then]
+
+: c$, $, 0 c, ;
+
+0 value #smbios-tables
+: copy-smbios-table ( dst-adr table -- dst-adr' )
+ #smbios-tables 1+ to #smbios-tables
+ 2dup 1+ c@ ( dst-adr table dst-adr len )
+ dup >r move ( dst-adr r: len )
+ r> + ( dst-adr' )
+;
+
+: smbios-c, ( dst-adr b -- dst-adr' ) over c! 1+ ;
+: smbios-w, ( dst-adr w -- dst-adr' ) over le-w! wa1+ ;
+: smbios-l, ( dst-adr l -- dst-adr' ) over le-l! la+ ;
+: smbios-null ( dst-adr -- dst-adr' ) 0 smbios-c, ;
+: end-smbios-table ( dst-adr -- dst-adr' ) smbios-null ;
+: +smbios$ ( dst-adr adr len -- dst-adr' )
+ 3dup rot swap move ( dst-adr adr len )
+ nip + smbios-null
+;
+
+0 value uuid-adr
+
+create smbios-entry
+( 00 ) " _SM_" $,
+( 04 ) 0 c, \ Byte checksum - structure must sum to 0 SETME
+( 05 ) h# 1f c, \ Entry structure length
+( 06 ) h# 02 c, \ Major version
+( 07 ) h# 01 c, \ Minor version
+( 08 ) h# 100 w, \ Maximum size of a structure
+( 0a ) h# 00 c, \ Entry point revision
+( 0b ) 0 c, 0 c, 0 c, 0 c, 0 c, \ Formatted area
+( 10 ) " _DMI_" $, \ Intermediate anchor string
+( 15 ) 0 c, \ Intermediate checksum SETME
+( 16 ) 0 w, \ Structure table length SETME
+( 18 ) 0 l, \ Structure table address SETME
+\ ( 1c ) d# 11 w, \ Number of structures
+( 1c ) d# 12 w, \ Number of structures
+( 1e ) h# 21 c, \ BCD revision
+
+create bios-info
+( 00 ) 0 c, \ BIOS info type code
+( 01 ) h# 13 c, \ Length (one BIOS characteristic extension byte)
+( 02 ) h# 0000 w, \ Handle
+( 04 ) 1 c, \ Vendor string index
+( 05 ) 2 c, \ Version string index
+( 06 ) h# f000 w, \ BIOS starting address segment
+( 08 ) 3 c, \ Release date index
+( 09 ) h# 0f c, \ BIOS ROM size in 64K chunks, minus 1
+( 0a ) h# 99880 l, \ BIOS characteristics - PCI, Reflash, shadowing, CD boot, selectable boot, EDD
+( 0e ) 0 l, \ Vendor and system specific BIOS characteristics
+( 12 ) 1 c, \ ACPI is supported
+\ " OLPC" c$, \ Vendor string
+\ " Q2E00" c$, \ Version string
+\ " 04/01/2008" c$, \ Release date string
+\ 0 c, \ End
+
+create system-info
+( 00 ) 1 c, \ System info type code
+( 01 ) h# 19 c, \ Length (for v2.1)
+( 02 ) h# 0100 w, \ Handle
+( 04 ) 1 c, \ Manufacturer string index
+( 05 ) 2 c, \ Product name string index
+( 06 ) 3 c, \ Version string index
+( 07 ) 4 c, \ Serial number string index
+( 08 ) here to uuid-adr h# 10 allot \ SETME
+( 18 ) 6 c, \ Wake up type
+\ " OLPC" c$, \ 1: Manufacturer
+\ " XO" c$, \ 2: Product Name
+\ " 1" c$, \ 3: Version
+\ " <sn>" c$, \ 4: Serial number
+\ 0 c,
+
+create base-board-info
+( 00 ) 2 c, \ System info type code
+( 01 ) h# 8 c, \ Length (for v2.1)
+( 02 ) h# 0200 w, \ Handle
+( 04 ) 1 c, \ Manufacturer string index
+( 05 ) 2 c, \ Product string index
+( 06 ) 3 c, \ Version string index
+( 07 ) 4 c, \ Serial number string index
+\ " QUANTA" c$, \ 1: Manufacturer
+\ " XO" c$, \ 2: Product Name
+\ " 1" c$, \ 3: Version
+
+
+create system-enclosure
+( 00 ) 3 c, \ System enclosure type code
+( 01 ) h# 0d c, \ Length (for v2.1)
+( 02 ) h# 0300 w, \ Handle
+( 04 ) 1 c, \ Manufacturer string index
+( 05 ) 9 c, \ Type - laptop
+( 06 ) 2 c, \ Version number string index
+( 07 ) 0 c, \ Serial number string index
+( 08 ) 0 c, \ Asset tag string index
+( 09 ) 3 c, \ Boot-up state
+( 0a ) 3 c, \ Power Supply State
+( 0b ) 3 c, \ Thermal State
+( 0c ) 5 c, \ Security Status - XXX set to 4 in secure mode
+\ " OLPC" c$, \ 2: Manufacturer
+\ " 1" c$, \ 3: Version
+\ 0 c,
+
+create processor-info
+( 00 ) 4 c, \ Processor info type code
+( 01 ) h# 20 c, \ Length (for v2.1)
+( 02 ) h# 0400 w, \ Handle
+( 04 ) 0 c, \ Reference designator string index
+( 05 ) 3 c, \ Type - CPU
+( 06 ) 1 c, \ Family - other
+( 07 ) 1 c, \ Manufacturer
+( 08 ) h# 5a2 l, h# 88a93d l, \ CPUID results - Set dynamically later
+( 10 ) 2 c, \ Processor version string index
+( 11 ) h# 8c c, \ Processor voltage (h# 80 + 1.2V/10)
+( 12 ) d# 33 w, \ External clock (main bus clock)
+( 14 ) d# 433 w, \ Max speed
+( 16 ) d# 433 w, \ Current speed
+( 18 ) h# 41 c, \ CPU present and enabled
+( 19 ) 6 c, \ Processor upgrade - None
+( 1a ) h# 0701 w, \ L1 Cache Handle
+( 1c ) h# 0703 w, \ L2 Cache Handle
+( 1e ) h# ffff w, \ L3 Cache Handle
+\ " AuthenticAMD" c$, \ 1: Manufacturer
+\ 0 c,
+
+create l1-icache-info
+( 00 ) 7 c, \ Cache info type code
+( 01 ) h# 13 c, \ Length
+( 02 ) h# 0701 w, \ Handle
+( 04 ) 0 c, \ Socket string index
+( 05 ) h# 180 w, \ Writeback, enabled, internal, not socketed, L1
+( 07 ) h# 8002 w, \ Max size - 128K
+( 09 ) h# 8002 w, \ Installed size - 128K
+( 0b ) 1 w, \ Supported SRAM type - unknown
+( 0d ) 1 w, \ Installed SRAM type - unknown
+( 0f ) 0 c, \ Speed (NS)
+( 10 ) 1 c, \ ECC - other
+( 11 ) 5 c, \ Type - Unified (actually it is split I and D but they are coherent)
+( 12 ) 5 c, \ Associativity - 4-way set-associative
+\ 0 w,
+
+0 [if]
+create l1-dcache-info
+( 00 ) 7 c, \ Cache info type code
+( 01 ) h# 13 c, \ Length
+( 02 ) h# 0702 w, \ Handle
+( 04 ) 0 c, \ Socket string index
+( 05 ) h# 180 w, \ Writeback, enabled, internal, not socketed, L1
+( 07 ) h# 8001 w, \ Max size - 64K
+( 09 ) h# 8001 w, \ Installed size - 64K
+( 0b ) 1 w, \ Supported SRAM type - unknown
+( 0d ) 1 w, \ Installed SRAM type - unknown
+( 0f ) 0 c, \ Speed (NS)
+( 10 ) 3 c, \ ECC - none
+( 11 ) 4 c, \ Type - Data
+( 12 ) 8 c, \ Associativity - 16-way set-associative
+\ 0 w,
+[then]
+
+create l2-cache-info
+( 00 ) 7 c, \ Cache info type code
+( 01 ) h# 13 c, \ Length
+( 02 ) h# 0703 w, \ Handle
+( 04 ) 0 c, \ Socket string index
+( 05 ) h# 181 w, \ Writeback, enabled, internal, not socketed, L2
+( 07 ) h# 8002 w, \ Max size - 128K
+( 09 ) h# 8002 w, \ Installed size - 128K
+( 0b ) 1 w, \ Supported SRAM type - unknown
+( 0d ) 1 w, \ Installed SRAM type - unknown
+( 0f ) 0 c, \ Speed (NS)
+\ ( 10 ) 3 c, \ ECC - none
+( 10 ) 1 c, \ ECC - other
+( 11 ) 5 c, \ Type - Unified
+( 12 ) h# a c, \ Associativity - 32-way set-associative
+\ 0 w,
+
+0 value portinfo#
+: make-smbios-port ( dst-adr connectortype porttype name$ -- dst-adr' )
+ #smbios-tables 1+ to #smbios-tables
+ 2>r >r >r
+ 8 smbios-c, 9 smbios-c,
+ portinfo# h# 800 + smbios-w, portinfo# 1+ to portinfo#
+ 0 smbios-c, 0 smbios-c, \ Internal Refdes and Internal Connector Type
+ 1 smbios-c, \ String index
+ r> smbios-c, \ Connector type
+ r> smbios-c, \ Port type
+ 2r> +smbios$ \ Reference designator string
+ end-smbios-table
+;
+
+create sd-slot-array
+( 00 ) d# 9 c, \ physical-memory-array type code
+( 01 ) h# 0d c, \ Length
+( 02 ) h# d01 w, \ Handle
+( 04 ) 1 c, \ Refdes
+( 05 ) h# b c, \ Slot type - proprietary
+( 06 ) 1 c, \ Bus width - other
+( 07 ) 4 c, \ Usage - in use
+( 08 ) 3 c, \ Length - short
+( 09 ) h# 0000 w, \ ID - meaningless
+( 0b ) 4 c, \ Characteristics 1 - 3.3V
+( 0c ) 2 c, \ Characteristics 2 - hot plug
+
+create video-array
+( 00 ) d# 10 c, \ onboard device type code
+( 01 ) h# 06 c, \ Length
+( 02 ) h# a01 w, \ Handle
+( 04 ) h# 83 c, \ Enabled, type 3 (video)
+( 05 ) 1 c, \ Description string
+
+create bios-lang-array
+( 00 ) d# 13 c, \ BIOS language type code
+( 01 ) h# 16 c, \ Length
+( 02 ) h# d01 w, \ Handle
+( 04 ) 1 c, \ Number of languages
+( 05 ) 1 c, \ Flags - abbreviated format
+( 06 ) 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, 0 c, \ Res
+( 15 ) 1 c, \ Currrent language string
+
+create main-memory-array
+( 00 ) d# 16 c, \ physical-memory-array type code
+( 01 ) h# 0f c, \ Length
+( 02 ) h# 1001 w, \ Handle
+( 04 ) 3 c, \ Location - onboard
+( 05 ) 3 c, \ Use - system memory
+( 06 ) 3 c, \ ECC - none
+( 07 ) h# 100000 l, \ Maximum size - 1024K KiB (1 GiB)
+( 0b ) h# fffe w, \ Memory Error Info Handle - not provided
+( 0d ) 1 w, \ Number of devices
+\ 0 w,
+
+create memory-device
+( 00 ) d# 17 c, \ physical-memory-array type code
+( 01 ) h# 15 c, \ Length
+( 02 ) h# 1101 w, \ Handle
+( 04 ) h# 1001 w, \ Handle of "parent" memory array
+( 06 ) h# fffe w, \ Memory Error Info Handle - not provided
+( 08 ) d# 64 w, \ Total width
+( 0a ) d# 64 w, \ Data width
+( 0c ) h# 400 w, \ Size - 1024 MB
+( 0e ) h# 0b c, \ Form factor - row of chips
+( 0f ) 0 c, \ Set - not part of a set
+( 10 ) 1 c, \ Device Locator string index
+( 11 ) 0 c, \ Bank Locator string index
+( 12 ) h# 13 c, \ Memory type - DDR3
+( 13 ) h# 0080 w, \ Memory type detail - Synchronous
+\ " Soldered" c$,
+\ 0 w,
+
+create ma-mapped-address
+( 00 ) d# 19 c, \ memory-array-mapped-address type code
+( 01 ) h# 0f c, \ Length
+( 02 ) h# 1301 w, \ Handle
+( 04 ) 0 l, \ Starting address - first KiB
+( 08 ) h# fffff l, \ Ending address - last KiB
+( 0c ) h# 31 w, \ Handle of "parent" memory array
+( 0e ) h# 1 c, \ Partition width
+\ 0 w,
+
+create pointing-device
+( 00 ) d# 21 c, \ system boot info type code
+( 01 ) h# 07 c, \ Length
+( 02 ) h# 1501 w, \ Handle
+( 04 ) 7 c, \ Type - touchpad
+( 05 ) 4 c, \ Interface - PS/2
+( 06 ) 2 c, \ #buttons - 2
+
+
+create system-boot-info
+( 00 ) d# 32 c, \ system boot info type code
+( 01 ) h# 0b c, \ Length
+( 02 ) h# 2000 w, \ Handle
+( 04 ) 0 l, 0 w, \ 6 reseved bytes
+( 0a ) 0 c, \ Boot status - no errors
+\ 0 w,
+
+create end-array
+( 00 ) h# 7f c, \ End type code
+( 01 ) h# 04 c, \ Length
+( 02 ) h# 7f01 w, \ Handle
+
+
+: test-name$ ( -- $ ) " IE8y2D ScD%g4r2bAIFA." ;
+: test-version$ ( -- $ ) " OLPC Ver 1.50.01" ;
+: fw-version$ ( -- $ )
+ " /openprom" find-package if
+ " model" rot get-package-property 0= if
+ get-encoded-string ( adr len )
+ dup d# 16 = if
+ \ We just want the "Q2E00" part
+ drop 6 + 5 exit
+ then
+ 2drop
+ then
+ then
+ " Unknown"
+;
+d# 10 buffer: fw-date-buf
+
+\ Convert build-date format "2008-04-14" to SMBIOS format "04/14/2008"
+: fw-date$ ( -- $ )
+ " xx/xx/xxxx" fw-date-buf swap move
+ " build-date" evaluate drop ( adr )
+ dup fw-date-buf 6 + 4 move ( adr ) \ Year
+ dup 5 + fw-date-buf 2 move ( adr ) \ Month
+ 8 + fw-date-buf 3 + 2 move ( ) \ Day
+ fw-date-buf d# 10
+;
+: get-tag$ ( tag$ -- value$ ) find-tag 0= if " Not Available" then ?-null ;
+
+: too-long? ( dst-adr -- dst-adr flag ) dup pad - h# 10 >= ;
+: (uuid) ( -- true | adr len false )
+ " U#" find-tag if ( adr len )
+ ?-null ( adr len' )
+ pad -rot ( dst-adr adr len )
+ bounds ?do ( dst-adr )
+ too-long? if drop true unloop exit then
+ i c@ h# 10 digit if ( dst-adr digith )
+ i 1+ c@ h# 10 digit if ( dst-adr digith digitl )
+ swap 4 lshift or ( dst-adr byte )
+ over c! 1+ ( dst-adr' )
+ 2 ( dst-adr advance )
+ else ( dst-adr digith char )
+ 3drop true unloop exit
+ then ( dst-adr )
+ else ( dst-adr char )
+ [char] - <> if drop true unloop exit then
+ 1 ( dst-adr advance )
+ then ( dst-adr advance )
+ +loop ( dst-adr )
+ pad tuck - ( adr len )
+ dup h# 10 = if ( adr len )
+ false \ Good UUID ( adr len false )
+ else ( adr len )
+ 2drop true ( true )
+ then ( true | adr len false )
+ else ( )
+ true ( true )
+ then ( true | adr len false )
+;
+: get-uuid ( -- uuid$ )
+ (uuid) if " "(00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff)" then
+;
+
+code get-cpuid ( code -- eax ebx ecx edx )
+ ax pop cpuid ax push bx push cx push dx push
+c;
+0 value ptr
+: 0pad ( -- ) pad to ptr ;
+: pad, ( n -- ) ptr ! ptr na1+ to ptr ;
+
+: cpu-family$ ( -- adr len )
+ 0 get-cpuid 0pad rot pad, pad, pad, drop
+ pad d# 12
+;
+
+: 4scramble ( a b c d -- d c b a ) swap 2swap swap ;
+: cpu-name, ( cpuid# -- ) get-cpuid 4scramble pad, pad, pad, pad, ;
+
+: cpu-name$ ( -- adr len )
+ 0pad
+ h# 8000.0002 cpu-name,
+ h# 8000.0003 cpu-name,
+ h# 8000.0004 cpu-name,
+ pad h# 30 -leading -trailing
+;
+
+: +OLPC ( adr -- adr' ) " OLPC" +smbios$ ;
+: setup-smbios ( -- )
+ 0 to #smbios-tables
+ 0 to portinfo#
+
+ smbios-entry smbios-adr h# 1f move
+ smbios-adr h# 1f + ( adr )
+
+ bios-info copy-smbios-table ( adr )
+ test-name$ +smbios$
+ test-version$ +smbios$
+\ +OLPC
+\ fw-version$ +smbios$
+ fw-date$ +smbios$
+ end-smbios-table
+
+ dup >r ( adr r: adr )
+ system-info copy-smbios-table ( adr r: adr )
+ get-uuid r> 8 + swap move ( adr )
+ +OLPC
+ " XO" +smbios$
+ " 1" +smbios$ \ Version
+ " SN" get-tag$ +smbios$
+ end-smbios-table
+
+ base-board-info copy-smbios-table ( adr )
+ " QUANTA" +smbios$
+ " XO" +smbios$
+ " 1.5" +smbios$ \ Version
+ " SN" get-tag$ +smbios$
+ end-smbios-table
+
+ \ XXX might need to amend the security status field
+ system-enclosure copy-smbios-table ( adr )
+ +OLPC
+ " 1.5" +smbios$ \ Version
+ end-smbios-table
+
+ dup >r ( adr r: adr )
+ processor-info copy-smbios-table ( adr' r: adr )
+ 1 get-cpuid nip nip ( adr' eax edx r: adr )
+ r@ h# c + l! r> 8 + l! ( adr' )
+ cpu-family$ +smbios$
+ cpu-name$ +smbios$
+ end-smbios-table
+
+ l1-icache-info copy-smbios-table smbios-null end-smbios-table
+\ l1-dcache-info copy-smbios-table smbios-null end-smbios-table
+ l2-cache-info copy-smbios-table smbios-null end-smbios-table
+
+[ifdef] notdef \ Why bother - XP doesn't collect these
+ h# 1f h# 1d " Microphone" make-smbios-port
+ h# 1f h# 1d " Headphone" make-smbios-port
+ h# 12 h# 10 " USB1" make-smbios-port
+ h# 12 h# 10 " USB2" make-smbios-port
+ h# 12 h# 10 " USB3" make-smbios-port
+
+ sd-slot-array copy-smbios-table " SD Slot" +smbios$ end-smbios-table
+ bios-lang-array copy-smbios-table " enUS" +smbios$ end-smbios-table
+[then]
+ video-array copy-smbios-table " CON" +smbios$ end-smbios-table
+
+ main-memory-array copy-smbios-table smbios-null end-smbios-table
+ memory-device copy-smbios-table " Soldered" +smbios$ end-smbios-table
+ ma-mapped-address copy-smbios-table smbios-null end-smbios-table
+
+\ XP ignores it
+\ pointing-device copy-smbios-table smbios-null end-smbios-table
+
+ \ PORTABLE BATTERY (TYPE 22)
+
+\ XP ignores it
+\ system-boot-info copy-smbios-table smbios-null end-smbios-table
+
+ end-array copy-smbios-table smbios-null end-smbios-table ( adr' )
+
+ \ Fixup the entry structure
+ smbios-adr h# 1f + tuck - ( tables-adr tables-len )
+ smbios-adr h# 16 + w! ( tables-adr )
+ smbios-adr h# 18 + l! ( )
+ #smbios-tables smbios-adr h# 1c + w!
+
+ smbios-adr h# 1f 4 fix-checksum \ Overall checksum
+ smbios-adr h# 10 + h# 0f 5 fix-checksum \ Intermediate checksum
+;
+
+stand-init: SMBIOS tables
+ setup-smbios
+;
Modified: cpu/x86/pc/olpc/via/versions.fth
===================================================================
--- cpu/x86/pc/olpc/via/versions.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ cpu/x86/pc/olpc/via/versions.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -2,7 +2,7 @@
\ The overall firmware revision
macro: FW_MAJOR A
-macro: FW_MINOR 03t
+macro: FW_MINOR 04
\ The EC microcode
macro: EC_VERSION 1_9_1
Modified: ofw/inet/ip.fth
===================================================================
--- ofw/inet/ip.fth 2009-06-25 21:23:17 UTC (rev 1224)
+++ ofw/inet/ip.fth 2009-06-26 16:10:47 UTC (rev 1225)
@@ -76,9 +76,11 @@
then ( 'netmask-c )
;
-\ either h# ffffffff or h# 0 is broadcast ip addr
+\ Matches either h# ffffffff or h# 0 or subnet-specific broadcast addr
: broadcast-ip-addr? ( adr-buf -- flag )
- dup broadcast-ip-addr ip= swap unknown-ip-addr? or
+ dup broadcast-ip-addr ip=
+ swap def-broadcast-ip ip= or
+ over unknown-ip-addr? or
;
: netmask ( -- 'ip )
More information about the openfirmware
mailing list