Author: wmb
Date: 2010-01-08 03:23:07 +0100 (Fri, 08 Jan 2010)
New Revision: 1649
Added:
dev/hdaudio/config.fth
dev/hdaudio/cx2058x-nodes.fth
dev/hdaudio/start-cx2058x.fth
Modified:
cpu/x86/pc/olpc/via/addrs.fth
cpu/x86/pc/olpc/via/romreset.bth
dev/hdaudio/conexant.fth
Log:
OLPC trac 9970 - perform CODEC setup in early startup to ensure that thermal
and overcurrent protection is on after resume.
Modified: cpu/x86/pc/olpc/via/addrs.fth
===================================================================
--- cpu/x86/pc/olpc/via/addrs.fth 2010-01-07 21:12:26 UTC (rev 1648)
+++ cpu/x86/pc/olpc/via/addrs.fth 2010-01-08 02:23:07 UTC (rev 1649)
@@ -49,6 +49,8 @@
h# fd00.0000 constant fw-map-base
h# ffc0.0000 constant fw-map-limit
+h# 8fff.0000 constant hdac-pci-base \ Temporary for use during early startup
+
h# d000.0000 constant fb-pci-base
h# f000.0000 constant gfx-pci-base
\ h# fe01.a000 constant ohci-pci-base
Modified: cpu/x86/pc/olpc/via/romreset.bth
===================================================================
--- cpu/x86/pc/olpc/via/romreset.bth 2010-01-07 21:12:26 UTC (rev 1648)
+++ cpu/x86/pc/olpc/via/romreset.bth 2010-01-08 02:23:07 UTC (rev 1649)
@@ -86,6 +86,8 @@
fload ${BP}/cpu/x86/pc/olpc/via/startcominit.fth \ cominit subroutine
[then]
+fload ${BP}/dev/hdaudio/start-cx2058x.fth
+
label startup
h# 10 port80
@@ -226,6 +228,8 @@
\ Setup a small stack for subroutine calls
h# 10.0000 # esp mov
+ init-codec #) call
+
long-offsets on
acpi-io-base 4 + port-rw \ Get APCI Status register
ax bx mov
Modified: dev/hdaudio/conexant.fth
===================================================================
--- dev/hdaudio/conexant.fth 2010-01-07 21:12:26 UTC (rev 1648)
+++ dev/hdaudio/conexant.fth 2010-01-08 02:23:07 UTC (rev 1649)
@@ -13,22 +13,7 @@
: set-node ( node-id -- ) to node ;
-: afg ( -- ) 1 set-node ; \ Audio Function Group
-: dac1 ( -- ) h# 10 set-node ;
-: adc1 ( -- ) h# 14 set-node ;
-: mux ( -- ) h# 17 set-node ; \ mux between port b and port c
-: mux2 ( -- ) h# 18 set-node ;
-: porta ( -- ) h# 19 set-node ;
-: portb ( -- ) h# 1a set-node ; \ Port B - OLPC external mic
-: portc ( -- ) h# 1b set-node ; \ Port C - OLPC internal mic
-: portd ( -- ) h# 1c set-node ; \ Port D - OLPC unused
-: porte ( -- ) h# 1d set-node ; \ Port E - OLPC unused
-: portf ( -- ) h# 1e set-node ; \ Port F - OLPC DC input
-: portg ( -- ) h# 1f set-node ; \ Port G - speaker driver
-: porth ( -- ) h# 20 set-node ; \ Port H - S/PDIF out
-: porti ( -- ) h# 22 set-node ; \ Port I - S/PDIF out
-: portj ( -- ) h# 23 set-node ; \ Digital mic
-: vendor ( -- ) h# 25 set-node ; \ Vendor-specific controls
+fload ${BP}/dev/hdaudio/cx2058x-nodes.fth
: volume-on-all ( -- )
adc1 h# 36006 cmd h# 35006 cmd \ Left gain/mute, right gain/mute
@@ -68,23 +53,10 @@
;
: cx2058x-disable-playback ( -- ) ;
-: 1/8" ( u -- u ) h# 10000 or ;
-: green ( u -- u ) h# 4000 or ;
-: pink ( u -- u ) h# 9000 or ;
-: hp-out ( u -- u ) h# 200000 or ;
-: spdiff-out ( u -- u ) h# 400000 or ;
-: mic-in ( u -- u ) h# a00000 or ;
-: line-in ( u -- u ) h# 800000 or ;
-: line-out ( u -- u ) ;
-: speaker ( u -- u ) h# 100000 or ;
-: left ( u -- u ) h# 3000000 or ;
-: front ( u -- u ) h# 2000000 or ;
-: internal ( u -- u ) h# 10000000 or ;
-: jack ( u -- u ) h# 00000000 or ;
-: unused ( u -- u ) h# 40000000 or ;
-: builtin ( u -- u ) h# 80000000 or ;
+: config-default ( -- u ) f1c00 cmd? ;
-: config( ( node -- null-config-default ) 0 ;
+[ifdef] notdef \ Unnecessary because we do it in early startup assembly language
+fload ${BP}/dev/hdaudio/config.fth \ Names for configuration settings
: )config ( config-default -- )
\ set the high 24 bits of the config-default value
@@ -94,17 +66,14 @@
8 rshift h# ff and 71f00 or cmd
;
-
-: config-default ( -- u ) f1c00 cmd? ;
-
: setup-config-default ( -- )
porta config( 1/8" green left hp-out jack )config
portb config( 1/8" pink left mic-in jack )config
- portc config( builtin front mic-in )config
+ portc config( builtin internal front mic-in )config
portd config( unused line-out )config
porte config( unused line-out )config
portf config( 1/8" pink left line-in jack )config
- portg config( builtin front speaker )config
+ portg config( builtin internal front speaker )config
porth config( unused spdiff-out )config
porti config( unused spdiff-out )config
portj config( unused mic-in )config
@@ -113,11 +82,14 @@
: vendor-settings ( -- )
vendor
h# 290a8 cmd \ high-pass filter, semi-manual mode, 600Hz cutoff
- h# 34001 cmd \ speaker power 1 dB gain
- h# 38001 cmd \ over-current / short-circuit protection, 2.6A threshold
- h# 39019 cmd \ temperature protection at 130C
+\ h# 34001 cmd \ speaker power 1 dB gain
+ h# 34003 cmd \ speaker power -2 dB gain (1.26W @ 4 ohms)
+ h# 38021 cmd \ over-current / short-circuit protection, 2.6A threshold
+\ h# 39019 cmd \ temperature protection at 130C
+ h# 390c5 cmd \ temperature protection at 79.5C
h# 42011 cmd \ over-temperature shutdown of class-D
;
+[then]
\ check (expect) that cmd yields value
: check-cmd ( value cmd -- )
@@ -154,8 +126,8 @@
['] adc1 to with-adc
power-on-all
volume-on-all
- vendor-settings
- setup-config-default
+\ vendor-settings
+\ setup-config-default
;
: cx2058x-close ( -- ) afg power-off ; \ Power off entire Audio Function Group
Added: dev/hdaudio/config.fth
===================================================================
--- dev/hdaudio/config.fth (rev 0)
+++ dev/hdaudio/config.fth 2010-01-08 02:23:07 UTC (rev 1649)
@@ -0,0 +1,44 @@
+purpose: Names for HD Audio Configuration Default values
+\ See license at end of file
+
+: config( ( -- null-config-default ) 0 ;
+
+: 1/8" ( u -- u ) h# 10000 or ;
+: green ( u -- u ) h# 4000 or ;
+: pink ( u -- u ) h# 9000 or ;
+: hp-out ( u -- u ) h# 200000 or ;
+: spdiff-out ( u -- u ) h# 400000 or ;
+: mic-in ( u -- u ) h# a00000 or ;
+: line-in ( u -- u ) h# 800000 or ;
+: line-out ( u -- u ) ;
+: speaker ( u -- u ) h# 100000 or ;
+: left ( u -- u ) h# 3000000 or ;
+: front ( u -- u ) h# 2000000 or ;
+: internal ( u -- u ) h# 10000000 or ;
+: jack ( u -- u ) h# 00000000 or ;
+: unused ( u -- u ) h# 40000000 or ;
+: builtin ( u -- u ) h# 80000000 or ;
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 Luke Gorrie <luke(a)bup.co.nz>
+\
+\ 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
Added: dev/hdaudio/cx2058x-nodes.fth
===================================================================
--- dev/hdaudio/cx2058x-nodes.fth (rev 0)
+++ dev/hdaudio/cx2058x-nodes.fth 2010-01-08 02:23:07 UTC (rev 1649)
@@ -0,0 +1,43 @@
+purpose: Node names for Conexant CX2058x HD Audio CODEC
+\ See license at end of file
+
+: afg ( -- ) 1 set-node ; \ Audio Function Group
+: dac1 ( -- ) h# 10 set-node ;
+: adc1 ( -- ) h# 14 set-node ;
+: mux ( -- ) h# 17 set-node ; \ mux between port b and port c
+: mux2 ( -- ) h# 18 set-node ;
+: porta ( -- ) h# 19 set-node ;
+: portb ( -- ) h# 1a set-node ; \ Port B - OLPC external mic
+: portc ( -- ) h# 1b set-node ; \ Port C - OLPC internal mic
+: portd ( -- ) h# 1c set-node ; \ Port D - OLPC unused
+: porte ( -- ) h# 1d set-node ; \ Port E - OLPC unused
+: portf ( -- ) h# 1e set-node ; \ Port F - OLPC DC input
+: portg ( -- ) h# 1f set-node ; \ Port G - speaker driver
+: porth ( -- ) h# 20 set-node ; \ Port H - S/PDIF out
+: porti ( -- ) h# 22 set-node ; \ Port I - S/PDIF out
+: portj ( -- ) h# 23 set-node ; \ Digital mic
+: vendor ( -- ) h# 25 set-node ; \ Vendor-specific controls
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2009 Luke Gorrie <luke(a)bup.co.nz>
+\
+\ 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
Added: dev/hdaudio/start-cx2058x.fth
===================================================================
--- dev/hdaudio/start-cx2058x.fth (rev 0)
+++ dev/hdaudio/start-cx2058x.fth 2010-01-08 02:23:07 UTC (rev 1649)
@@ -0,0 +1,241 @@
+purpose: Early-startup code for Conexant CX2058x codec
+\ See license at end of file
+
+\ This runs at early startup time when the system is still running assembly
+\ language. It is used both for cold boot and for resume from S3.
+\ It compiles a verb table and blasts it out to the codec as quickly as possible.
+\ The reason we need to do this is to ensure that the critical settings for
+\ thermal and overcurrent protection in the Vendor node are always applied,
+\ especially in the resume-from-S3 case where we have no opportunity to run
+\ Forth code. Secondarily, we also get a chance to set the Configuration
+\ Default registers.
+
+\ Put the words for compiling the verb table in the transient dictionary so
+\ the don't take up space in the ROM image
+transient
+
+0 value codec
+0 value node
+
+: set-node ( node-id -- ) to node ;
+
+fload ${BP}/dev/hdaudio/cx2058x-nodes.fth \ Node names
+
+fload ${BP}/dev/hdaudio/config.fth \ Names for configuration settings
+
+0 value #verbs
+
+: place-verb ( verb+data -- )
+ node d# 20 lshift or
+ codec d# 28 lshift or
+ ,
+ #verbs 1+ to #verbs
+;
+: config-verb ( data-byte verb-code -- )
+ 8 lshift or place-verb
+;
+: )config ( value -- )
+ h# f0 or ( value ) \ Null association
+ lbsplit swap 2swap swap ( high hmid lmid low )
+ h# 71c config-verb
+ h# 71d config-verb
+ h# 71e config-verb
+ h# 71f config-verb
+;
+
+: start-verb-table ( -- )
+ " 0 to #verbs label verb-table" evaluate
+;
+: end-verb-table ( -- ) ;
+
+h# 100000 constant corb \ Physical address of DMA command buffer
+h# 101000 constant rirb \ Physical address of DMA response buffer
+
+resident
+
+hex
+start-verb-table
+ porta f0700 place-verb \ This is sacrificial, in case of problems with the first command
+
+ porta config( 1/8" green left hp-out jack )config
+ porta config( 1/8" green left hp-out jack )config
+ portb config( 1/8" pink left mic-in jack )config
+ portc config( builtin internal front mic-in )config
+ portd config( unused line-out )config
+ porte config( unused line-out )config
+ portf config( 1/8" pink left line-in jack )config
+ portg config( builtin internal front speaker )config
+ porth config( unused spdiff-out )config
+ porti config( unused spdiff-out )config
+ portj config( unused mic-in )config
+
+ vendor \ Vendor node
+
+ \ Codec registers
+ 21000 place-verb \ Undocumented register
+ 22000 place-verb \ Undocumented register
+ 23000 place-verb \ Undocumented register
+ 24000 place-verb \ Undocumented register
+ 25000 place-verb \ Undocumented register
+ 26000 place-verb \ Undocumented register
+ 27000 place-verb \ Undocumented register
+ 28000 place-verb \ Undocumented register
+ 290a8 place-verb \ high-pass filter, semi-manual mode, 600Hz cutoff
+ 2A000 place-verb \ low-pass filter (for subwoofers) off
+ 2B002 place-verb \ Undocumented register
+ 2C020 place-verb \ Undocumented register
+ 2D000 place-verb \ Undocumented register
+ 2E000 place-verb \ Undocumented register
+ 2F800 place-verb \ Undocumented register
+ \ Analog registers
+ 31000 place-verb \ Undocumented register
+ 32000 place-verb \ Undocumented register
+ 33000 place-verb \ Undocumented register
+ 34003 place-verb \ 4 ohm/1.59W \ Comment disagrees with documentation - Class-DSpeakerPower.pdf says value 003 is 4 ohm/1.26W
+ 35000 place-verb \ Undocumented register
+ 3600A place-verb \ Undocumented register
+ 37000 place-verb \ Undocumented register
+ 38021 place-verb \ over-current / short-circuit protection, 2.6A threshold
+ 390C5 place-verb \ temperature protection at 79.5C
+ 3A000 place-verb \ Undocumented register
+ \ Digital registers
+ 41541 place-verb \ Undocumented register
+ 42011 place-verb \ over-temperature shutdown of class-D amplifier
+ 43000 place-verb \ This documented as a status register and thus is presumably read-only. Why write to it?
+ 44000 place-verb \ Undocumented register
+ 45600 place-verb \ Undocumented register
+ 4600C place-verb \ Undocumented register
+ 4701F place-verb \ Undocumented register
+ 48004 place-verb \ Undocumented register
+ 49040 place-verb \ Undocumented register
+ 4C000 place-verb \ Undocumented register
+
+ afg \ Audio Function Group node
+
+ 71C01 place-verb \ Undocumented register
+ 71D00 place-verb \ SPDIF OFF BUT Int-Mic on \ Undocumented register
+ 71E00 place-verb \ Undocumented register
+ 71F00 place-verb \ disable software GSMark protection
+ 71F00 place-verb \ disable software GSMark protection - repeat in case of end condition issues
+end-verb-table
+
+\ Subroutine to turn on the HD Audio controller, push the verb table to the codec,
+\ then turn things back off.
+
+label init-codec
+ hdac-pci-base h# a010 config-wl \ Set PCI base address for HD Audio
+ 6 h# a004 config-ww \ Enable it for memory space and bus mastering
+
+ h# 01 # hdac-pci-base h# 08 + #) mov \ Release controller reset
+
+ h# 1000 # cx mov \ Maximum number of wait loop iterations
+ begin
+ h# 80 # al in \ ~1us delay
+ cx dec 0<> if \ Not timeout
+ hdac-pci-base h# 08 + #) ax mov \ wait for controller to come out of reset
+ 1 # al test
+ else
+ cx inc \ Force exit from loop
+ then
+ 0<> until
+
+ d# 350 wait-us \ Wait for Codec to wake up (250 needed; extra for good measure)
+
+ h# 00 # hdac-pci-base h# 4c + #) byte mov \ CORB DMA off
+
+ h# 1000 # cx mov \ Maximum number of wait loop iterations
+ begin
+ h# 80 # al in \ ~1us delay
+ cx dec 0<> if \ Not timeout
+ hdac-pci-base h# 4c + #) al mov \ wait for CORB DMA off
+ 2 # al test
+ then
+ 0= until
+
+ corb # hdac-pci-base h# 40 + #) mov \ CORB lower base address
+ 0 # hdac-pci-base h# 44 + #) mov \ CORB upper base address
+op: 0 # hdac-pci-base h# 48 + #) mov \ CORB write pointer
+op: h# 8000 # hdac-pci-base h# 4a + #) mov \ CORB read pointer reset
+ 2 # hdac-pci-base h# 4e + #) byte mov \ CORB size - 256 entries
+
+ 2 # hdac-pci-base h# 4c + #) byte mov \ CORB DMA on
+
+ h# 00 # hdac-pci-base h# 5c + #) byte mov \ RIRB DMA off
+
+ h# 1000 # cx mov \ Maximum number of wait loop iterations
+ begin
+ h# 80 # al in \ ~1us delay
+ cx dec 0<> if \ Not timeout
+ hdac-pci-base h# 5c + #) al mov \ wait for RIRB DMA off
+ 2 # al test
+ then
+ 0= until
+
+ rirb # hdac-pci-base h# 50 + #) mov \ RIRB lower base address
+ 0 # hdac-pci-base h# 54 + #) mov \ RIRB upper base address
+op: h# 8000 # hdac-pci-base h# 58 + #) mov \ RIRB write pointer reset
+ 2 # hdac-pci-base h# 5e + #) byte mov \ RIRB size - 256 entries
+
+ 2 # hdac-pci-base h# 5c + #) byte mov \ RIRB DMA on
+
+ \ Copy the verb table to the CORB DMA area
+ #verbs # cx mov
+ verb-table # si mov
+ corb # di mov
+ rep movs
+
+ op: #verbs # hdac-pci-base h# 48 + #) mov \ Hand off the verbs by setting the CORB write pointer
+
+ h# 1000 # cx mov \ Maximum number of wait loop iterations
+ begin
+ h# 80 # al in \ ~1us delay
+ cx dec 0<> if \ Not timeout
+ op: hdac-pci-base h# 4a + #) ax mov \ Read CORB read pointer to catch up with write pointer
+ op: #verbs # ax cmp \ Wait for it to catch up
+ then
+ 0= until
+
+ h# 1000 # cx mov
+ begin
+ h# 80 # al in \ ~1us delay
+ cx dec 0<> if \ Not timeout
+ op: hdac-pci-base h# 58 + #) ax mov \ Read RIRB write pointer
+ op: #verbs 1- # ax cmp \ Wait for it to catch up
+ then
+ 0= until
+
+ d# 100 wait-us \ Just in case
+
+ h# 00 # hdac-pci-base h# 4c + #) byte mov \ CORB DMA off
+ h# 00 # hdac-pci-base h# 5c + #) byte mov \ RIRB DMA off
+ h# 00 # hdac-pci-base h# 08 + #) mov \ Reset controller
+
+ 0 h# a004 config-ww \ Disable memory space and bus mastering
+
+ ret
+end-code
+
+
+\ LICENSE_BEGIN
+\ Copyright (c) 2010 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