Subversion Repositories Kolibri OS

Rev

Rev 4324 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. format PE DLL native 0.05
  9. section '.flat' code readable writable executable
  10.  
  11. DEBUG           equ 1
  12. FDEBUG          equ 0
  13. DEBUG_IRQ       equ 0
  14.  
  15. USE_SINGLE_MODE equ  0   ; 1 = Single mode; 0 = Normal mode.
  16. USE_UNSOL_EV    equ  1   ; 1 = Use unsolicited events; 0 = Do not use unsolicited events.
  17.  
  18. TEST_VERSION_NUMBER  equ '019'
  19.  
  20. ;Asper+ [
  21. SDO_TAG  equ 1        ;Output stream tag id (any number except 0)
  22. SDO_IDX  equ 4        ;Output stream index
  23. ;According to "Intel® I/O Controller Hub 6 (ICH6) High Definition Audio / AC ’97 Programmer’s Reference Manual (PRM) May 2005 Document"
  24. ;and "Intel® I/O Controller Hub 6 (ICH6) Family Datasheet" SDO0=4,
  25. ;but according to "High Definition Audio Specification Revision 1.0a June 17, 2010" SDO0 depends on the number of SDIs.
  26.  
  27. SDO_INT         equ 1 shl SDO_IDX       ;Output stream interrupt (must be power of 2)
  28. SDO_OFS         equ 0x80+(SDO_IDX*0x20) ;Output stream offset
  29. ;Asper+ ]
  30.  
  31. CURRENT_API     equ   0x0100      ;1.00
  32. COMPATIBLE_API  equ   0x0101      ;1.01
  33. API_VERSION     equ   (COMPATIBLE_API shl 16) or CURRENT_API
  34.  
  35. IRQ_REMAP       equ 0
  36. IRQ_LINE        equ 0
  37.  
  38. CPU_FREQ        equ  2600d
  39.  
  40. ; Vendors
  41. VID_INTEL         equ 0x8086
  42. VID_NVIDIA        equ 0x10DE
  43. VID_ATI           equ 0x1002
  44. VID_AMD           equ 0x1022
  45. VID_VIA           equ 0x1106
  46. VID_SIS           equ 0x1039
  47. VID_ULI           equ 0x10B9
  48. VID_CREATIVE      equ 0x1102
  49. VID_TERA          equ 0x6549
  50. VID_RDC           equ 0x17F3
  51. VID_VMWARE        equ 0x15AD
  52.  
  53. ; Devices
  54. ; Intel
  55. CTRL_INTEL_SCH2          equ  0x080a
  56. CTRL_INTEL_HPT           equ  0x0c0c
  57. CTRL_INTEL_CPT           equ  0x1c20
  58. CTRL_INTEL_PGB           equ  0x1d20
  59. CTRL_INTEL_PPT1          equ  0x1e20
  60. CTRL_INTEL_82801F        equ  0x2668
  61. CTRL_INTEL_63XXESB       equ  0x269a
  62. CTRL_INTEL_82801G        equ  0x27d8
  63. CTRL_INTEL_82801H        equ  0x284b
  64. CTRL_INTEL_82801_UNK1    equ  0x2911
  65. CTRL_INTEL_82801I        equ  0x293e
  66. CTRL_INTEL_82801_UNK2    equ  0x293f
  67. CTRL_INTEL_82801JI       equ  0x3a3e
  68. CTRL_INTEL_82801JD       equ  0x3a6e
  69. CTRL_INTEL_PCH           equ  0x3b56
  70. CTRL_INTEL_PCH2          equ  0x3b57
  71. CTRL_INTEL_SCH           equ  0x811b
  72. CTRL_INTEL_LPT           equ  0x8c20
  73. ; Nvidia
  74. CTRL_NVIDIA_MCP51        equ  0x026c
  75. CTRL_NVIDIA_MCP55        equ  0x0371
  76. CTRL_NVIDIA_MCP61_1      equ  0x03e4
  77. CTRL_NVIDIA_MCP61_2      equ  0x03f0
  78. CTRL_NVIDIA_MCP65_1      equ  0x044a
  79. CTRL_NVIDIA_MCP65_2      equ  0x044b
  80. CTRL_NVIDIA_MCP67_1      equ  0x055c
  81. CTRL_NVIDIA_MCP67_2      equ  0x055d
  82. CTRL_NVIDIA_MCP78_1      equ  0x0774
  83. CTRL_NVIDIA_MCP78_2      equ  0x0775
  84. CTRL_NVIDIA_MCP78_3      equ  0x0776
  85. CTRL_NVIDIA_MCP78_4      equ  0x0777
  86. CTRL_NVIDIA_MCP73_1      equ  0x07fc
  87. CTRL_NVIDIA_MCP73_2      equ  0x07fd
  88. CTRL_NVIDIA_MCP79_1      equ  0x0ac0
  89. CTRL_NVIDIA_MCP79_2      equ  0x0ac1
  90. CTRL_NVIDIA_MCP79_3      equ  0x0ac2
  91. CTRL_NVIDIA_MCP79_4      equ  0x0ac3
  92. CTRL_NVIDIA_0BE2         equ  0x0be2
  93. CTRL_NVIDIA_0BE3         equ  0x0be3
  94. CTRL_NVIDIA_0BE4         equ  0x0be4
  95. CTRL_NVIDIA_GT100        equ  0x0be5
  96. CTRL_NVIDIA_GT106        equ  0x0be9
  97. CTRL_NVIDIA_GT108        equ  0x0bea
  98. CTRL_NVIDIA_GT104        equ  0x0beb
  99. CTRL_NVIDIA_GT116        equ  0x0bee
  100. CTRL_NVIDIA_MCP89_1      equ  0x0d94
  101. CTRL_NVIDIA_MCP89_2      equ  0x0d95
  102. CTRL_NVIDIA_MCP89_3      equ  0x0d96
  103. CTRL_NVIDIA_MCP89_4      equ  0x0d97
  104. CTRL_NVIDIA_GF119        equ  0x0e08
  105. CTRL_NVIDIA_GF110_1      equ  0x0e09
  106. CTRL_NVIDIA_GF110_2      equ  0x0e0c
  107. ; ATI
  108. CTRL_ATI_SB450           equ  0x437b
  109. CTRL_ATI_SB600           equ  0x4383
  110. ; ATI HDMI
  111. CTRL_ATI_RS600           equ  0x793b
  112. CTRL_ATI_RS690           equ  0x7919
  113. CTRL_ATI_RS780           equ  0x960f
  114. CTRL_ATI_RS_UNK1         equ  0x970f
  115. CTRL_ATI_R600            equ  0xaa00
  116. CTRL_ATI_RV630           equ  0xaa08
  117. CTRL_ATI_RV610           equ  0xaa10
  118. CTRL_ATI_RV670           equ  0xaa18
  119. CTRL_ATI_RV635           equ  0xaa20
  120. CTRL_ATI_RV620           equ  0xaa28
  121. CTRL_ATI_RV770           equ  0xaa30
  122. CTRL_ATI_RV730           equ  0xaa38
  123. CTRL_ATI_RV710           equ  0xaa40
  124. CTRL_ATI_RV740           equ  0xaa48
  125. ; AMD
  126. CTRL_AMD_HUDSON          equ  0x780d
  127. ; VIA
  128. CTRL_VIA_VT82XX          equ  0x3288
  129. CTRL_VIA_VT61XX          equ  0x9140
  130. CTRL_VIA_VT71XX          equ  0x9170
  131. ; SiS
  132. CTRL_SIS_966             equ  0x7502
  133. ; ULI
  134. CTRL_ULI_M5461           equ  0x5461
  135. ; Creative
  136. CTRL_CREATIVE_CA0110_IBG     equ  0x0009
  137. CTRL_CREATIVE_SOUND_CORE3D_1 equ  0x0010
  138. CTRL_CREATIVE_SOUND_CORE3D_2 equ  0x0012
  139. ; Teradici
  140. CTRL_TERA_UNK1           equ  0x1200
  141. ; RDC Semiconductor
  142. CTRL_RDC_R3010           equ  0x3010
  143. ;VMware
  144. CTRL_VMWARE_UNK1         equ  0x1977
  145.  
  146.  
  147. ; driver types
  148. AZX_DRIVER_ICH           equ  0
  149. AZX_DRIVER_PCH           equ  1
  150. AZX_DRIVER_SCH           equ  2
  151. AZX_DRIVER_ATI           equ  3
  152. AZX_DRIVER_ATIHDMI       equ  4
  153. AZX_DRIVER_VIA           equ  5
  154. AZX_DRIVER_SIS           equ  6
  155. AZX_DRIVER_ULI           equ  7
  156. AZX_DRIVER_NVIDIA        equ  8
  157. AZX_DRIVER_TERA          equ  9
  158. AZX_DRIVER_CTX           equ  10
  159. AZX_DRIVER_GENERIC       equ  11
  160. AZX_NUM_DRIVERS          equ  12
  161.  
  162.  
  163. ; registers
  164.  
  165. ICH6_REG_GCAP            equ  0x00
  166. ICH6_REG_VMIN            equ  0x02
  167. ICH6_REG_VMAJ            equ  0x03
  168. ICH6_REG_OUTPAY          equ  0x04
  169. ICH6_REG_INPAY           equ  0x06
  170. ICH6_REG_GCTL            equ  0x08
  171.   ICH6_GCTL_RESET          equ  (1 shl 0)  ; controller reset
  172.   ICH6_GCTL_FCNTRL         equ  (1 shl 1)  ; flush control
  173.   ICH6_GCTL_UNSOL          equ  (1 shl 8)  ; accept unsol. response enable
  174. ICH6_REG_WAKEEN          equ  0x0c
  175. ICH6_REG_STATESTS        equ  0x0e
  176. ICH6_REG_GSTS            equ  0x10
  177.   ICH6_GSTS_FSTS           equ  (1 shl 1)  ; flush status
  178. ICH6_REG_INTCTL          equ  0x20
  179. ICH6_REG_INTSTS          equ  0x24
  180. ICH6_REG_WALLCLK         equ  0x30  ; 24Mhz source
  181. ICH6_REG_OLD_SSYNC       equ  0x34  ; SSYNC for old ICH
  182. ICH6_REG_SSYNC           equ  0x38
  183. ICH6_REG_CORBLBASE       equ  0x40
  184. ICH6_REG_CORBUBASE       equ  0x44
  185. ICH6_REG_CORBWP          equ  0x48
  186. ICH6_REG_CORBRP          equ  0x4A
  187.   ICH6_CORBRP_RST          equ  (1 shl 15)  ; read pointer reset
  188. ICH6_REG_CORBCTL         equ  0x4c
  189.   ICH6_CORBCTL_RUN         equ  (1 shl 1)   ; enable DMA
  190.   ICH6_CORBCTL_CMEIE       equ  (1 shl 0)   ; enable memory error irq
  191. ICH6_REG_CORBSTS         equ  0x4d
  192.   ICH6_CORBSTS_CMEI        equ  (1 shl 0)   ; memory error indication
  193. ICH6_REG_CORBSIZE        equ  0x4e
  194.  
  195. ICH6_REG_RIRBLBASE       equ  0x50
  196. ICH6_REG_RIRBUBASE       equ  0x54
  197. ICH6_REG_RIRBWP          equ  0x58
  198.   ICH6_RIRBWP_RST          equ  (1 shl 15)  ; write pointer reset
  199. ICH6_REG_RINTCNT         equ  0x5a
  200. ICH6_REG_RIRBCTL         equ  0x5c
  201.   ICH6_RBCTL_IRQ_EN        equ  (1 shl 0)   ; enable IRQ
  202.   ICH6_RBCTL_DMA_EN        equ  (1 shl 1)   ; enable DMA
  203.   ICH6_RBCTL_OVERRUN_EN    equ  (1 shl 2)   ; enable overrun irq
  204. ICH6_REG_RIRBSTS         equ  0x5d
  205.   ICH6_RBSTS_IRQ           equ  (1 shl 0)   ; response irq
  206.   ICH6_RBSTS_OVERRUN       equ  (1 shl 2)   ; overrun irq
  207. ICH6_REG_RIRBSIZE        equ  0x5e
  208.  
  209. ICH6_REG_IC              equ  0x60
  210. ICH6_REG_IR              equ  0x64
  211. ICH6_REG_IRS             equ  0x68
  212.   ICH6_IRS_VALID           equ  2
  213.   ICH6_IRS_BUSY            equ  1
  214.  
  215. ICH6_REG_DPLBASE         equ  0x70
  216. ICH6_REG_DPUBASE         equ  0x74
  217.   ICH6_DPLBASE_ENABLE      equ  1     ; Enable position buffer
  218.  
  219. ; SD offset: SDI0=0x80, SDI1=0xa0, ... SDO3=0x160 */
  220. SDI0_SD_OFFSET    equ  0x80
  221. SDI1_SD_OFFSET    equ  0xA0
  222. SDI2_SD_OFFSET    equ  0xC0
  223. SDI3_SD_OFFSET    equ  0xE0
  224. SDO0_SD_OFFSET    equ  0x100
  225. SDO1_SD_OFFSET    equ  0x120
  226. SDO2_SD_OFFSET    equ  0X140
  227. SDO3_SD_OFFSET    equ  0x160
  228.  
  229. ; stream register offsets from stream base
  230. ICH6_REG_SD_CTL          equ  0x00
  231. ICH6_REG_SD_STS          equ  0x03
  232. ICH6_REG_SD_LPIB         equ  0x04
  233. ICH6_REG_SD_CBL          equ  0x08
  234. ICH6_REG_SD_LVI          equ  0x0c
  235. ICH6_REG_SD_FIFOW        equ  0x0e
  236. ICH6_REG_SD_FIFOSIZE     equ  0x10
  237. ICH6_REG_SD_FORMAT       equ  0x12
  238. ICH6_REG_SD_BDLPL        equ  0x18
  239. ICH6_REG_SD_BDLPU        equ  0x1c
  240.  
  241. ; PCI space
  242. ICH6_PCIREG_TCSEL        equ  0x44
  243.  
  244. ; other constants
  245. ICH6_RIRB_EX_UNSOL_EV    equ   (1 shl 4)
  246.  
  247. ; max number of SDs
  248. MAX_ICH6_DEV             equ  8
  249. ; max number of fragments - we may use more if allocating more pages for BDL
  250. AZX_MAX_FRAG             equ  (4096 / (MAX_ICH6_DEV * 16))
  251. ; max buffer size - no h/w limit, you can increase as you like
  252. AZX_MAX_BUF_SIZE         equ  (1024*1024*1024)
  253. ; max number of PCM devices per card
  254. AZX_MAX_PCMS             equ  8
  255.  
  256. ; RIRB int mask: overrun[2], response[0]
  257. RIRB_INT_RESPONSE        equ  0x01
  258. RIRB_INT_OVERRUN         equ  0x04
  259. RIRB_INT_MASK            equ  0x05
  260.  
  261. ; STATESTS int mask: SD2,SD1,SD0
  262. STATESTS_INT_MASK        equ  0x07
  263. AZX_MAX_CODECS           equ  4
  264.  
  265. ; SD_CTL bits
  266. SD_CTL_STREAM_RESET      equ  0x01    ; stream reset bit
  267. SD_CTL_DMA_START         equ  0x02    ; stream DMA start bit
  268. SD_CTL_STREAM_TAG_MASK   equ  (0xf shl 20)
  269. SD_CTL_STREAM_TAG_SHIFT  equ  20
  270.  
  271. ; SD_CTL and SD_STS
  272. SD_INT_DESC_ERR          equ  0x10    ; descriptor error interrupt
  273. SD_INT_FIFO_ERR          equ  0x08    ; FIFO error interrupt
  274. SD_INT_COMPLETE          equ  0x04    ; completion interrupt
  275. SD_INT_MASK              equ  (SD_INT_DESC_ERR or SD_INT_FIFO_ERR or SD_INT_COMPLETE)
  276.  
  277. ; SD_STS
  278. SD_STS_FIFO_READY        equ  0x20    ; FIFO ready
  279.  
  280. ; INTCTL and INTSTS
  281. ICH6_INT_ALL_STREAM      equ  0xff            ; all stream interrupts
  282. ICH6_INT_CTRL_EN         equ  0x40000000      ; controller interrupt enable bit
  283. ICH6_INT_GLOBAL_EN       equ  0x80000000      ; global interrupt enable bit
  284.  
  285. ; GCTL reset bit
  286. ICH6_GCTL_RESET          equ  1
  287.  
  288. ; CORB/RIRB control, read/write pointer
  289. ICH6_RBCTL_DMA_EN        equ  0x02    ; enable DMA
  290. ICH6_RBCTL_IRQ_EN        equ  0x01    ; enable IRQ
  291. ICH6_RBRWP_CLR           equ  0x8000  ; read/write pointer clear
  292. ; below are so far hardcoded - should read registers in future
  293. ICH6_MAX_CORB_ENTRIES    equ  256
  294. ICH6_MAX_RIRB_ENTRIES    equ  256
  295.  
  296. ; position fix mode
  297. POS_FIX_AUTO             equ  0
  298. POS_FIX_LPIB             equ  1
  299. POS_FIX_POSBUF           equ  2
  300. POS_FIX_VIACOMBO         equ  4
  301. POS_FIX_COMBO            equ  8
  302.  
  303. ; Defines for ATI HD Audio support in SB450 south bridge
  304. ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR   equ  0x42
  305. ATI_SB450_HDAUDIO_ENABLE_SNOOP      equ  0x02
  306.  
  307. ; Defines for Nvidia HDA support
  308. NVIDIA_HDA_TRANSREG_ADDR            equ  0x4e
  309. NVIDIA_HDA_ENABLE_COHBITS           equ  0x0f
  310. NVIDIA_HDA_ISTRM_COH                equ  0x4d
  311. NVIDIA_HDA_OSTRM_COH                equ  0x4c
  312. NVIDIA_HDA_ENABLE_COHBIT            equ  0x01
  313.  
  314. ; Defines for Intel SCH HDA snoop control
  315. INTEL_SCH_HDA_DEVC                  equ  0x78
  316. INTEL_SCH_HDA_DEVC_NOSNOOP          equ  (0x1 shl 11)
  317.  
  318. ; Define IN stream 0 FIFO size offset in VIA controller
  319. VIA_IN_STREAM0_FIFO_SIZE_OFFSET     equ  0x90
  320. ; Define VIA HD Audio Device ID
  321. VIA_HDAC_DEVICE_ID                  equ  0x3288
  322.  
  323. ; HD Audio class code
  324. PCI_CLASS_MULTIMEDIA_HD_AUDIO       equ  0x0403
  325.  
  326.  
  327. SRV_GETVERSION           equ  0
  328. DEV_PLAY                 equ  1
  329. DEV_STOP                 equ  2
  330. DEV_CALLBACK             equ  3
  331. DEV_SET_BUFF             equ  4
  332. DEV_NOTIFY               equ  5
  333. DEV_SET_MASTERVOL        equ  6
  334. DEV_GET_MASTERVOL        equ  7
  335. DEV_GET_INFO             equ  8
  336. DEV_GET_POS              equ  9
  337. DEV_SET_CHANNEL_VOLUME   equ  10
  338. DEV_GET_CHANNEL_VOLUME   equ  11
  339. ;Asper: Non standard system service. For the tests only! [
  340. DEV_EXEC_CODEC_CMD       equ  100
  341. ;Asper: Non standard system service. For the tests only! ]
  342.  
  343. struc AC_CNTRL              ;AC controller base class
  344. {
  345.         .bus                dd ?
  346.         .devfn              dd ?
  347.  
  348.         .vendor             dw ?
  349.         .dev_id             dw ?
  350.         .pci_cmd            dd ?
  351.         .pci_stat           dd ?
  352.  
  353.         .ctrl_io_base       dd ?
  354.         .ctrl_mem_base      dd ?
  355.         .cfg_reg            dd ?
  356.         .int_line           dd ?
  357.  
  358.         .vendor_ids         dd ?    ;vendor id string
  359.         .ctrl_ids           dd ?    ;hub id string
  360.  
  361.         .buffer             dd ?
  362.  
  363.         .notify_pos         dd ?
  364.         .notify_task        dd ?
  365.  
  366.         .lvi_reg            dd ?
  367.         .civ_val            dd 1
  368.         .user_callback      dd ?
  369.  
  370.         .ctrl_read8         dd ?
  371.         .ctrl_read16        dd ?
  372.         .ctrl_read32        dd ?
  373.  
  374.         .ctrl_write8        dd ?
  375.         .ctrl_write16       dd ?
  376.         .ctrl_write32       dd ?
  377.  
  378.         .codec_mask         dd ?
  379.         .rb                 dd ?
  380.         .rirb_rp            dw 0
  381.         .rirb_wp            dw 0
  382.         .corb_rp            dw 0
  383.         .corb_wp            dw 0
  384.         .rirb_cmd           dd 0
  385.         .rirb_res           dd 0
  386.         .rirb_error         dd 0
  387.         .response_reset     dd 0
  388.         .polling_mode       db 0
  389.         .poll_count         db 0
  390.         .posbuf             dd ?
  391.         .start_wallclk      dd ? ; start + minimum wallclk
  392.         .period_wallclk     dd ? ; wallclk for period
  393.         .position_fix       db ?
  394. }
  395.  
  396. struc CODEC                ;Audio Chip base class
  397. {
  398.         .addr               dd ?    ; codec slot index (codec address)
  399.         .afg                dd ?    ; AFG node id
  400.         .mfg                dd ?    ; MFG node id
  401.  
  402.         .function_id        dd ?
  403.         .subsystem_id       dd ?
  404.         .revision_id        dd ?
  405.         .chip_id            dw ?
  406.         .vendor_id          dw ?
  407.  
  408.         ; widget capabilities cache
  409.         .num_nodes          dw ?
  410.         .start_nid          dw ?
  411.         .wcaps              dd ?
  412.  
  413.         .init_pins          dd ?    ; initial (BIOS) pin configurations
  414.         .num_pins           dd ?    ;Asper +  : word is enough, but for align...
  415.         .beeper_nid         dw ?
  416.                       .pad  dw ?
  417.  
  418.         .ac_vendor_ids      dd ?    ;ac vendor id string
  419.         .chip_ids           dd ?    ;chip model string
  420. }
  421.  
  422. struc CTRL_INFO
  423. {
  424.         .pci_cmd            dd ?
  425.         .irq                dd ?
  426.         .glob_cntrl         dd ?
  427.         .glob_sta           dd ?
  428.         .codec_io_base      dd ?
  429.         .ctrl_io_base       dd ?
  430.         .codec_mem_base     dd ?
  431.         .ctrl_mem_base      dd ?
  432.         .codec_id           dd ?
  433. }
  434.  
  435. struc IOCTL
  436. {
  437.         .handle             dd ?
  438.         .io_code            dd ?
  439.         .input              dd ?
  440.         .inp_size           dd ?
  441.         .output             dd ?
  442.         .out_size           dd ?
  443. }
  444.  
  445. EVENT_NOTIFY    equ 0x00000200
  446.  
  447. ; Macroses by CleverMouse
  448. ; The following macro assume that we are on uniprocessor machine.
  449. ; Serious work is needed for multiprocessor machines.
  450. macro spin_lock_irqsave spinlock
  451. {
  452.         pushf
  453.         cli
  454. }
  455. macro spin_unlock_irqrestore spinlock
  456. {
  457.         popf
  458. }
  459. macro spin_lock_irq spinlock
  460. {
  461.         cli
  462. }
  463. macro spin_unlock_irq spinlock
  464. {
  465.         sti
  466. }
  467.  
  468. SPINLOCK_BUSY = 1
  469. SPINLOCK_FREE = 0
  470.  
  471. macro spin_lock
  472. {
  473.         push    eax ebx
  474.         mov     eax, aspinlock
  475.         mov     ebx, SPINLOCK_BUSY
  476. @@:
  477.         lock    xchg [eax], ebx
  478.         cmp     ebx, SPINLOCK_FREE
  479.         jnz     @b
  480.         pop     ebx eax
  481. }
  482.  
  483. macro spin_unlock
  484. {
  485.         push    eax ebx
  486.         mov     eax, aspinlock
  487.         mov     eax, aspinlock
  488.         mov     ebx, SPINLOCK_FREE
  489.         lock    xchg    [eax], ebx
  490.         pop     ebx eax
  491. }
  492.  
  493. data fixups
  494. end data
  495.  
  496. include '../../struct.inc'
  497. include '../../macros.inc'
  498. include '../../proc32.inc'
  499. include '../../peimport.inc'
  500. include 'CODEC_H.INC'
  501.  
  502. entry START
  503. section '.flat' readable writable executable
  504.  
  505. ;proc START stdcall, state:dword
  506. proc START c, state:dword, cmdline:dword
  507.         push    ebx esi ; save used registers to be stdcall
  508. virtual at esp
  509.                 rd      2 ; saved registers
  510.                 dd      ? ; return address
  511. .reason         dd      ? ; DRV_ENTRY or DRV_EXIT
  512. .cmdline        dd      ? ; normally NULL
  513. end virtual
  514. ; 1. Check the reason for the call, do nothing unless initializing.
  515.         ;cmp [.reason], DRV_ENTRY
  516.         ;jne .stop
  517.  
  518. if DEBUG
  519.         mov     esi, msgTV
  520.         invoke  SysMsgBoardStr
  521.  
  522.         mov     esi, msgInit
  523.         invoke  SysMsgBoardStr
  524. end if
  525.  
  526.         call    detect_controller
  527.         test    eax, eax
  528.         jz      .fail
  529.  
  530.         mov     esi,[ctrl.vendor_ids]
  531.         invoke  SysMsgBoardStr
  532.         mov     esi, [ctrl.ctrl_ids]
  533.         invoke  SysMsgBoardStr
  534.  
  535.         call    init_controller
  536.         test    eax, eax
  537.         jz      .fail
  538.  
  539. ;Asper This part is from "azx_create" proc. [
  540.         mov     [ctrl.position_fix], POS_FIX_LPIB
  541.         cmp     [driver_type], AZX_DRIVER_VIA
  542.         je      .set_via_patch
  543.         cmp     [driver_type], AZX_DRIVER_ATI
  544.         jne     .no_via_patch
  545. .set_via_patch:
  546.         or      [ctrl.position_fix], POS_FIX_VIACOMBO
  547. .no_via_patch:
  548.         ; codec detection
  549.         mov     eax, [ctrl.codec_mask]
  550.         test    eax, eax
  551.         jnz     @f
  552. if DEBUG
  553.         mov     esi, msgNoCodecsFound
  554.         jmp     .fail_msg
  555. else
  556.         jmp     .fail
  557. end if
  558. @@:
  559. ;Asper ]
  560.  
  561.         mov     esi, msgPrimBuff
  562.         invoke  SysMsgBoardStr
  563.         call    create_primary_buff
  564.         mov     esi, msgDone
  565.         invoke  SysMsgBoardStr
  566.  
  567. if IRQ_REMAP
  568.         pushf
  569.         cli
  570.  
  571.         mov     ebx, [ctrl.int_line]
  572.         in      al, 0xA1
  573.         mov     ah, al
  574.         in      al, 0x21
  575.         test    ebx, ebx
  576.         jz      .skip
  577.         bts     ax, bx                  ;mask old line
  578. .skip
  579.         bts     ax, IRQ_LINE            ;mask new line
  580.         out     0x21, al
  581.         mov     al, ah
  582.         out     0xA1, al
  583.                                            ;remap IRQ
  584.         invoke  PciWrite8, 0, 0xF8, 0x61, IRQ_LINE
  585.  
  586.         mov     dx, 0x4d0               ;8259 ELCR1
  587.         in      al, dx
  588.         bts     ax, IRQ_LINE
  589.         out     dx, al                  ;set level-triggered mode
  590.         mov     [ctrl.int_line], IRQ_LINE
  591.         popf
  592.         mov     esi, msgRemap
  593.         invoke  SysMsgBoardStr
  594. end if
  595.  
  596.         mov     ebx, [ctrl.int_line]
  597.         invoke  AttachIntHandler, ebx, hda_irq, dword 0
  598.  
  599. ;Asper This part is from "azx_probe" proc. [
  600.         call    azx_codec_create
  601.         cmp     eax, 0
  602.         jl      .fail
  603.  
  604.         call    azx_codec_configure
  605.         cmp     eax, 0
  606.         jl      .fail
  607. ;] Asper
  608.  
  609.         ; create PCM streams
  610. ;Asper+ [
  611.         mov     eax, [spec.dac_node]
  612. if DEBUG ;-
  613.         push    eax esi
  614.         mov     esi, msgVal
  615.         invoke  SysMsgBoardStr
  616.         stdcall  fdword2str, 3
  617.         invoke  SysMsgBoardStr
  618.         pop     esi eax
  619. end if
  620.  
  621.         test    eax, eax
  622.         jz      .fail
  623.         mov     ebx, [spec.dac_node+4]
  624. if DEBUG ;-
  625.         push    eax esi
  626.         mov     esi, msgVal
  627.         invoke  SysMsgBoardStr
  628.         mov     eax, [spec.dac_node+4]
  629.         stdcall fdword2str, 3
  630.         invoke  SysMsgBoardStr
  631.         pop     esi eax
  632. end if
  633.  
  634.         test    ebx, ebx
  635.         jz      @f
  636.         cmp     eax, ebx
  637.         je      @f
  638.         stdcall hda_codec_setup_stream, ebx, SDO_TAG, 0, 0x11   ; Left & Right channels (Front panel)
  639. @@:
  640.         stdcall hda_codec_setup_stream, eax, SDO_TAG, 0, 0x11   ; Left & Right channels (Back panel)
  641. ;Asper+ ]
  642.  
  643. if USE_SINGLE_MODE
  644.         mov     esi, msgSingleMode
  645.         invoke  SysMsgBoardStr
  646. else
  647.         mov     esi, msgNormalMode
  648.         invoke  SysMsgBoardStr
  649. end if
  650.  
  651. .reg:
  652.         invoke  RegService, sz_sound_srv, service_proc
  653.         pop     esi ebx
  654.         ret
  655. .fail:
  656.         mov     esi, msgFail
  657. .fail_msg:
  658.         invoke  SysMsgBoardStr
  659.         pop     esi ebx
  660.         xor     eax, eax
  661.         ret
  662. .stop:
  663.         call    stop
  664.         pop     esi ebx
  665.         xor     eax, eax
  666.         ret
  667. endp
  668.  
  669. handle     equ  IOCTL.handle
  670. io_code    equ  IOCTL.io_code
  671. input      equ  IOCTL.input
  672. inp_size   equ  IOCTL.inp_size
  673. output     equ  IOCTL.output
  674. out_size   equ  IOCTL.out_size
  675.  
  676. align 4
  677. proc service_proc stdcall, ioctl:dword
  678.         mov     edi, [ioctl]
  679.         mov     eax, [edi+io_code]
  680.  
  681.         cmp     eax, SRV_GETVERSION
  682.         jne     @F
  683.  
  684.         mov     eax, [edi+output]
  685.         cmp     [edi+out_size], 4
  686.         jne     .fail
  687.  
  688.         mov     [eax], dword API_VERSION
  689.         xor     eax, eax
  690.         ret
  691. @@:
  692.         cmp     eax, DEV_PLAY
  693.         jne     @F
  694. if DEBUG
  695.         mov     esi, msgPlay
  696.         invoke  SysMsgBoardStr
  697. end if
  698.         call    play
  699.         xor     eax, eax
  700.         ret
  701. @@:
  702.         cmp     eax, DEV_STOP
  703.         jne     @F
  704. if DEBUG
  705.         mov     esi, msgStop
  706.         invoke  SysMsgBoardStr
  707. end if
  708.         call    stop
  709.         xor     eax, eax
  710.         ret
  711. @@:
  712.         cmp     eax, DEV_CALLBACK
  713.         jne     @f
  714.         mov     ebx, [edi+input]
  715.         stdcall set_callback, [ebx]
  716.         xor     eax, eax
  717.         ret
  718. @@:
  719.         cmp     eax, DEV_SET_MASTERVOL
  720.         jne     @f
  721.         mov     eax, [edi+input]
  722.         mov     eax, [eax]
  723.         call    set_master_vol
  724.         xor     eax, eax
  725.         ret
  726. @@:
  727.         cmp     eax, DEV_GET_MASTERVOL
  728.         jne     @f
  729.         mov     ebx, [edi+output]
  730.         stdcall get_master_vol, ebx
  731.         xor     eax, eax
  732.         ret
  733. ;@@:
  734. ;        cmp     eax, DEV_GET_INFO
  735. ;        jne     @f
  736. ;        mov     ebx, [edi+output]
  737. ;        stdcall get_dev_info, ebx
  738. ;        xor     eax, eax
  739. ;        ret
  740. @@:
  741.         cmp     eax, DEV_GET_POS
  742.         jne     @f
  743.         stdcall azx_get_position
  744.         shr     eax, 2
  745.         mov     ebx, [edi+output]
  746.         mov     [ebx], eax
  747.         xor     eax, eax
  748.         ret
  749. @@:
  750. ;        cmp     eax, DEV_SET_CHANNEL_VOLUME
  751. ;        jne     @f
  752. ;if DEBUG
  753. ;        mov     esi, msgSetChannelVolume
  754. ;        invoke  SysMsgBoardStr
  755. ;end if
  756. ;        mov      ebx, [edi+input]
  757. ;        mov      cl,  byte [ebx]      ; cl=channel
  758. ;        mov      eax, dword [ebx+1]   ; eax=volume in Db
  759. ;if DEBUG
  760. ;        push    eax esi
  761. ;        mov     esi, msgYAHOO1
  762. ;        invoke  SysMsgBoardStr
  763. ;        stdcall fdword2str, 1
  764. ;        invoke  SysMsgBoardStr
  765. ;        mov     esi, strSemicolon
  766. ;        invoke  SysMsgBoardStr
  767. ;        movzx   eax, cl
  768. ;        stdcall fdword2str, 3
  769. ;        invoke  SysMsgBoardStr
  770. ;        pop     esi eax
  771. ;end if
  772. ;    ;        call    set_channel_volume
  773. ;        xor     eax, eax
  774. ;        ret
  775. ;@@:
  776. ;        cmp     eax, DEV_GET_CHANNEL_VOLUME
  777. ;        jne     @f
  778. ;        mov     cl,  byte [edi+input]  ; cl=channel
  779. ;        call    get_channel_volume
  780. ;        mov     ebx, [edi+output]
  781. ;        mov     [ebx], eax
  782. ;        xor     eax, eax
  783. ;        ret
  784. ;@@:
  785.  
  786. ;Asper: Non standard system service. For the tests only! [
  787. @@:
  788.         cmp      eax, DEV_EXEC_CODEC_CMD
  789.         jne      @f
  790.  
  791.         mov      eax, [edi+input]
  792.         mov      eax, [eax]
  793.         stdcall  codec_exec_verb, eax
  794.         xor      eax, eax
  795.         ret
  796. @@:
  797. ;Asper: Non standard system service. For the tests only! ]
  798.  
  799. .fail:
  800.         or       eax, -1
  801.         ret
  802. endp
  803.  
  804. restore handle
  805. restore io_code
  806. restore input
  807. restore inp_size
  808. restore output
  809. restore out_size
  810.  
  811.  
  812. align 4
  813. proc hda_irq   ;+
  814.         spin_lock
  815. if DEBUG_IRQ
  816.         push    eax esi
  817.         ;mov     esi, msgIRQ
  818.         ;invoke  SysMsgBoardStr
  819.         call    GetTimerTicks
  820.         stdcall fdword2str, 2
  821.         invoke  SysMsgBoardStr
  822.         pop     esi eax
  823. end if
  824.         mov     edx, ICH6_REG_INTSTS
  825.         call    azx_readl
  826.         test    eax, eax
  827.         jnz     @f
  828.         spin_unlock
  829.         ret
  830. @@:
  831.         mov     ebx, eax ; status
  832.         mov     eax, SDO_INT
  833.         test    ebx, eax
  834.         jz      @f
  835.  
  836.         mov     edx, ICH6_REG_SD_STS + SDO_OFS
  837.         call    azx_readb
  838.         mov     bl, al
  839.  
  840.         mov     al, SD_INT_MASK
  841.         mov     edx, ICH6_REG_SD_STS + SDO_OFS
  842.         call    azx_writeb
  843.  
  844.         test    bl, SD_INT_COMPLETE
  845.         jz      @f
  846.  
  847.         mov     eax, [ctrl.civ_val]
  848.         inc     eax
  849.         and     eax, 4-1 ;2-1
  850.         mov     [ctrl.civ_val], eax
  851.  
  852.         mov     ebx, dword [buff_list+eax*4]
  853.         cmp     [ctrl.user_callback], 0
  854.         je      @f
  855.         stdcall [ctrl.user_callback], ebx
  856. @@:
  857.         ; clear rirb int
  858.         mov     edx, ICH6_REG_RIRBSTS
  859.         call    azx_readb
  860.  
  861.         test    al, RIRB_INT_MASK
  862.         jz      .l1
  863.         test    al, RIRB_INT_RESPONSE
  864.         jz      .l2
  865.  
  866.         cmp     byte [driver_type], AZX_DRIVER_CTX
  867.         jne     @f
  868.         mov     eax, 80    ; wait 80 us
  869.         call    StallExec
  870. @@:
  871.         call    azx_update_rirb
  872. .l2:
  873.         mov     al, RIRB_INT_MASK
  874.         mov     edx, ICH6_REG_RIRBSTS
  875.         call    azx_writeb
  876. .l1:
  877.  
  878. ;if 0
  879.         ; clear state status int
  880.         mov     edx, ICH6_REG_STATESTS
  881.         call    azx_readb
  882.         test    al, 0x04
  883.         jz      @f
  884.  
  885.         mov     al, 0x04
  886.         mov     edx, ICH6_REG_STATESTS
  887.         call    azx_writeb
  888. @@:
  889. ;end if
  890.         or      eax, 1
  891.         spin_unlock
  892.         ret
  893. endp
  894.  
  895.  
  896. align 4
  897. proc create_primary_buff
  898.  
  899.         invoke  KernelAlloc, 4096
  900.         mov     [ctrl.posbuf], eax
  901.  
  902.         invoke  KernelAlloc, 0x10000 ;0x8000
  903.         mov     [ctrl.buffer], eax
  904.  
  905.         mov     edi, eax
  906.         mov     ecx, 0x10000/4 ;0x8000/4
  907.         xor     eax, eax
  908.         cld
  909.         rep     stosd
  910.  
  911.         invoke  KernelAlloc, 4096
  912.         mov     [pcmout_bdl], eax
  913.  
  914.         mov     edi, eax
  915.         mov     ecx, 4096/4
  916.         xor     eax, eax
  917.         cld
  918.         rep     stosd
  919.  
  920.         ; reset BDL address
  921.         xor     eax, eax
  922.         mov     edx, ICH6_REG_SD_BDLPL + SDO_OFS
  923.         call    azx_writel
  924.         xor     eax, eax
  925.         mov     edx, ICH6_REG_SD_BDLPU + SDO_OFS
  926.         call    azx_writel
  927.  
  928.         ; program the initial BDL entries
  929.         mov     eax, [ctrl.buffer]
  930.         mov     ebx, eax
  931.         invoke  GetPgAddr
  932.         and     ebx, 0xFFF
  933.         add     eax, ebx
  934.  
  935.         mov     ebx, 0x4000 ;buffer size
  936.         mov     ecx, 8      ;number of periods
  937.         mov     edi, [pcmout_bdl] ;pcmout_bdl
  938. .next_period:
  939.         push    eax ecx
  940.         mov     ecx, 4 ;2  ;number of bdl in a period
  941. .next_bdl:
  942.         ; program the address field of the BDL entry
  943.         mov     dword [edi], eax
  944.         mov     dword [edi+4], 0
  945.         ; program the size field of the BDL entry
  946.         mov     dword [edi+8],  ebx
  947.         ; program the IOC to enable interrupt when buffer completes
  948.         mov     dword [edi+12], 0x01
  949.  
  950.         add     eax, ebx
  951.         add     edi, 16
  952.         dec     ecx
  953.         jnz     .next_bdl
  954.  
  955.         pop     ecx eax
  956.         dec     ecx
  957.         jnz     .next_period
  958.  
  959.         mov     edi, buff_list
  960.         mov     eax, [ctrl.buffer]
  961.         mov     ecx, 4 ;2
  962. @@:
  963.         mov     [edi], eax
  964.         mov     [edi+8], eax
  965.         mov     [edi+16], eax
  966.         mov     [edi+24], eax
  967.         mov     [edi+32], eax
  968.         mov     [edi+40], eax
  969.         mov     [edi+48], eax
  970.         mov     [edi+56], eax
  971.  
  972.         add     eax, ebx
  973.         add     edi, 4
  974.         loop    @B
  975.  
  976.         ; wallclk has 24Mhz clock source
  977.         mov     [ctrl.period_wallclk], ((0x4000 * 24000) / 48000) * 1000
  978.  
  979.         call    azx_stream_reset
  980.         call    azx_setup_controller
  981.         ret
  982. endp
  983.  
  984. align 4
  985. proc detect_controller
  986. locals
  987.         last_bus dd ?
  988.         bus      dd ?
  989.         devfn    dd ?
  990. endl
  991.         xor     eax, eax
  992.         mov     [bus], eax
  993.         inc     eax
  994.         invoke  PciApi
  995.         cmp     eax, -1
  996.         je      .err
  997.  
  998.         mov     [last_bus], eax
  999.  
  1000. .next_bus:
  1001.         and     [devfn], 0
  1002. .next_dev:
  1003.         invoke  PciRead32, [bus], [devfn], dword 0
  1004.         test    eax, eax
  1005.         jz      .next
  1006.         cmp     eax, -1
  1007.         je      .next
  1008.  
  1009.         mov     edi, devices
  1010. @@:
  1011.         mov     ebx, [edi]
  1012.         test    ebx, ebx
  1013.         jz      .next
  1014.  
  1015.         cmp     eax, ebx
  1016.         je      .found
  1017.         add     edi, 12
  1018.         jmp     @b
  1019. .next:
  1020.         inc     [devfn]
  1021.         cmp     [devfn], 256
  1022.         jb      .next_dev
  1023.         mov     eax, [bus]
  1024.         inc     eax
  1025.         mov     [bus], eax
  1026.         cmp     eax, [last_bus]
  1027.         jna     .next_bus
  1028.         xor     eax, eax
  1029.         ret
  1030. .found:
  1031.         mov     ebx, [bus]
  1032.         mov     [ctrl.bus], ebx
  1033.  
  1034.         mov     ecx, [devfn]
  1035.         mov     [ctrl.devfn], ecx
  1036.  
  1037.         mov     edx, eax
  1038.         and     edx, 0xFFFF
  1039.         mov     [ctrl.vendor], dx
  1040.         shr     eax, 16
  1041.         mov     [ctrl.dev_id], ax
  1042.  
  1043.         mov     ebx, [edi+4]
  1044.         mov     [ctrl.ctrl_ids], ebx
  1045.  
  1046.         cmp     edx, VID_INTEL
  1047.         jne     @f
  1048.         mov     [ctrl.vendor_ids], msg_Intel
  1049.         jmp     .ok
  1050. @@:
  1051.         cmp     edx, VID_NVIDIA
  1052.         jne     @f
  1053.         mov     [ctrl.vendor_ids], msg_NVidia
  1054.         jmp     .ok
  1055. @@:
  1056.         cmp     edx, VID_ATI
  1057.         jne     @f
  1058.         cmp     eax, 0x4383
  1059.         jg      .ati_hdmi
  1060.         mov     [ctrl.vendor_ids], msg_ATI
  1061.         jmp     .ok
  1062. .ati_hdmi:
  1063.         mov     [ctrl.vendor_ids], msg_ATI_HDMI
  1064.         jmp     .ok
  1065. @@:
  1066.         cmp     edx, VID_AMD
  1067.         jne     @f
  1068.         mov     [ctrl.vendor_ids], msg_AMD
  1069.         jmp     .ok
  1070. @@:
  1071.         cmp     edx, VID_VIA
  1072.         jne     @f
  1073.         mov     [ctrl.vendor_ids], msg_VIA
  1074.         jmp     .ok
  1075. @@:
  1076.         cmp     edx, VID_SIS
  1077.         jne     @f
  1078.         mov     [ctrl.vendor_ids], msg_SIS
  1079.         jmp     .ok
  1080. @@:
  1081.         cmp     edx, VID_ULI
  1082.         jne     @f
  1083.         mov     [ctrl.vendor_ids], msg_ULI
  1084.         jmp     .ok
  1085. @@:
  1086.         cmp     edx, VID_TERA
  1087.         jne     @f
  1088.         mov     [ctrl.vendor_ids], msg_TERA
  1089.         jmp     .ok
  1090. @@:
  1091.         cmp     edx, VID_CREATIVE
  1092.         jne     @f
  1093.         mov     [ctrl.vendor_ids], msg_CREATIVE
  1094.         jmp     .ok
  1095. @@:
  1096.         cmp     edx, VID_RDC
  1097.         jne     @f
  1098.         mov     [ctrl.vendor_ids], msg_RDC
  1099.         jmp     .ok
  1100. @@:
  1101.         cmp     edx, VID_VMWARE
  1102.         jne     @f
  1103.         mov     [ctrl.vendor_ids], msg_VMWARE
  1104.         jmp     .ok
  1105. @@:
  1106. .err:
  1107.         xor     eax, eax
  1108.         mov     [ctrl.vendor_ids], eax     ;something  wrong ?
  1109.         mov     [driver_type], -1
  1110.         ret
  1111. .ok:
  1112.         mov     ebx, [edi+8]
  1113.         mov     [driver_type], ebx
  1114.         ret
  1115. endp
  1116.  
  1117. align 4
  1118. proc init_controller
  1119.  
  1120.         invoke  PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
  1121.         test    eax, 0x4 ; Test Master bit
  1122.         jnz     @f
  1123.         or      eax, 0x4 ; Set Master bit
  1124.         invoke  PciWrite32, [ctrl.bus], [ctrl.devfn], dword 4, eax
  1125.         invoke  PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
  1126. @@:
  1127.         mov     ebx, eax
  1128.         and     eax, 0xFFFF
  1129.         mov     [ctrl.pci_cmd], eax
  1130.         shr     ebx, 16
  1131.         mov     [ctrl.pci_stat], ebx
  1132.  
  1133.         mov     esi, msgPciCmd
  1134.         invoke  SysMsgBoardStr
  1135.         stdcall fdword2str, 2
  1136.         invoke  SysMsgBoardStr
  1137.  
  1138.         mov     esi, msgPciStat
  1139.         invoke  SysMsgBoardStr
  1140.         mov     eax, [ctrl.pci_stat]
  1141.         stdcall fdword2str, 2
  1142.         invoke  SysMsgBoardStr
  1143.  
  1144.         mov     esi, msgHDALowMMIo
  1145.         invoke  SysMsgBoardStr
  1146.         invoke  PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
  1147.         stdcall fdword2str, 2
  1148.         invoke  SysMsgBoardStr
  1149.  
  1150.         and     eax, 0xFFFFC000
  1151.         mov     [ctrl.ctrl_mem_base], eax
  1152.  
  1153.         mov     esi, msgHDAUpMMIo
  1154.         invoke  SysMsgBoardStr
  1155.         invoke  PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
  1156.         ;-mov     [ctrl.hda_upper_mem_base], eax
  1157.         stdcall fdword2str, 2
  1158.         invoke  SysMsgBoardStr
  1159.  
  1160. .default:
  1161.         invoke  PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
  1162.         and     eax, 0xFF
  1163. @@:
  1164.         mov     [ctrl.int_line], eax
  1165.         mov     [ctrl.user_callback], 0
  1166.  
  1167.         call    set_HDA
  1168. ;Asper This is from "azx_create" proc. [
  1169.         xor     eax, eax
  1170.         mov     edx, ICH6_REG_GCAP
  1171.         call    azx_readw
  1172. if DEBUG
  1173.         mov     esi, msgGCap
  1174.         invoke  SysMsgBoardStr
  1175.         stdcall fdword2str, 2
  1176.         invoke  SysMsgBoardStr
  1177. end if
  1178.         ; allocate CORB/RIRB
  1179.         call    azx_alloc_cmd_io
  1180.  
  1181.         ; initialize chip
  1182.         call    azx_init_pci
  1183.  
  1184.         xor     eax, eax
  1185.         call    azx_init_chip
  1186. ;] Asper
  1187.  
  1188.         xor     eax, eax
  1189.         inc     eax
  1190.         ret
  1191. endp
  1192.  
  1193.  
  1194.  
  1195. PG_SW           equ 0x003
  1196. PG_NOCACHE      equ 0x018
  1197.  
  1198. align 4
  1199. proc set_HDA
  1200.         invoke  MapIoMem,[ctrl.ctrl_mem_base],0x1000,PG_SW+PG_NOCACHE
  1201.         mov     [ctrl.ctrl_mem_base], eax
  1202.         ret
  1203. endp
  1204.  
  1205.  
  1206. ; in:  eax - fullreset_flag
  1207. ;
  1208. ; reset codec link
  1209. align 4
  1210. proc reset_controller
  1211. locals
  1212.         counter dd ?
  1213. endl
  1214.  
  1215.         test    eax, eax
  1216.         jz      .skip
  1217.  
  1218.         ; clear STATESTS
  1219.         mov     eax, STATESTS_INT_MASK
  1220.         mov     edx, ICH6_REG_STATESTS
  1221.         call    azx_writeb
  1222.  
  1223.         ; reset controller
  1224.         mov     edx, ICH6_REG_GCTL
  1225.         call    azx_readl
  1226.         mov     ebx, ICH6_GCTL_RESET
  1227.         xor     ebx, -1
  1228.         and     eax, ebx
  1229.         mov     edx, ICH6_REG_GCTL
  1230.         call    azx_writel
  1231.  
  1232.         mov     [counter], 50    ; total 50*100 us = 0.5s
  1233. .wait0:
  1234.  
  1235.         mov     edx, ICH6_REG_GCTL
  1236.         call    azx_readb
  1237.         test    eax, eax
  1238.         jz      @f
  1239.  
  1240.         mov     eax, 100    ; wait 100 us
  1241.         call    StallExec
  1242.  
  1243.         dec     [counter]
  1244.         jnz     .wait0
  1245. @@:
  1246.         ; delay for >= 100us for codec PLL to settle per spec
  1247.         ; Rev 0.9 section 5.5.1
  1248.         mov     eax, 100    ; wait 100 us
  1249.         call    StallExec
  1250.  
  1251.         ; Bring controller out of reset
  1252.         mov     edx, ICH6_REG_GCTL
  1253.         call    azx_readb
  1254.         or      eax, ICH6_GCTL_RESET
  1255.         mov     edx, ICH6_REG_GCTL
  1256.         call    azx_writeb
  1257.  
  1258.         mov     [counter], 50    ; total 50*100 us = 0.5s
  1259. .wait1:
  1260.  
  1261.         mov     edx, ICH6_REG_GCTL
  1262.         call    azx_readb
  1263.         test    eax, eax
  1264.         jnz     @f
  1265.  
  1266.         mov     eax, 100    ; wait 100 us
  1267.         call    StallExec
  1268.  
  1269.         dec     [counter]
  1270.         jnz     .wait1
  1271. @@:
  1272.  
  1273.         ; Brent Chartrand said to wait >= 540us for codecs to intialize
  1274.         mov     eax, 540    ; wait 540 us
  1275.         call    StallExec
  1276.  
  1277. .skip:
  1278.         ; check to see if controller is ready
  1279.         mov     edx, ICH6_REG_GCTL
  1280.         call    azx_readb
  1281.         test    eax, eax
  1282.         jz      .fail
  1283.  
  1284.         ; Accept unsolicited responses
  1285. if USE_SINGLE_MODE
  1286. else if USE_UNSOL_EV
  1287. ;UNSUPPORTED YET! [
  1288.         mov     edx, ICH6_REG_GCTL
  1289.         call    azx_readl
  1290.         or      eax, ICH6_GCTL_UNSOL
  1291.         mov     edx, ICH6_REG_GCTL
  1292.         call    azx_writel
  1293. ;UNSUPPORTED YET! ]
  1294. end if
  1295.  
  1296.         ; detect codecs
  1297.         mov     eax, [ctrl.codec_mask]
  1298.         test    ax, ax
  1299.         jnz     @f
  1300.  
  1301.         mov     edx, ICH6_REG_STATESTS
  1302.         call    azx_readw
  1303.         mov     [ctrl.codec_mask], eax
  1304.  
  1305. if DEBUG
  1306.         mov     esi, msgCodecMask
  1307.         invoke  SysMsgBoardStr
  1308.         stdcall fdword2str, 2
  1309.         invoke  SysMsgBoardStr
  1310. end if
  1311.  
  1312. @@:
  1313.  
  1314. .ok:
  1315.         clc
  1316.         ret
  1317. .fail:
  1318. if DEBUG
  1319.         mov     esi, msgHDARFail
  1320.         invoke  SysMsgBoardStr
  1321. end if
  1322.         stc
  1323.         ret
  1324. endp
  1325.  
  1326.  
  1327. align 4
  1328. play:
  1329.         spin_lock_irq
  1330.         mov     edx, ICH6_REG_WALLCLK
  1331.         call    azx_readl
  1332.         mov     [ctrl.start_wallclk], eax
  1333.  
  1334.         call    azx_stream_start
  1335.         xor     eax, eax
  1336.         spin_unlock_irq
  1337.         ret
  1338.  
  1339. align 4
  1340. stop:
  1341.         spin_lock_irq
  1342. ;*        call    azx_stream_stop        ;Asper: Hangs system
  1343. ;R        push    ebx ecx edx
  1344. ;R        ; stop DMA
  1345. ;R        mov     edx, ICH6_REG_SD_CTL
  1346. ;R        call    azx_sd_readb
  1347. ;R        mov     bl, SD_CTL_DMA_START or SD_INT_MASK
  1348. ;R        xor     bl, -1
  1349. ;R        and     al, bl
  1350. ;R        mov     edx, ICH6_REG_SD_CTL
  1351. ;R        call    azx_sd_writeb
  1352. ;R        mov     edx, ICH6_REG_SD_STS
  1353. ;R        mov     al, SD_INT_MASK
  1354. ;R        call    azx_sd_writeb  ; to be sure
  1355.           ; disable SIE
  1356. ;N        mov     edx, ICH6_REG_INTCTL
  1357. ;N        call    azx_readb
  1358. ;N        mov     bl, SDO_INT ;shl azx_dev->index
  1359. ;N        xor     bl, -1
  1360. ;N        and     al, bl
  1361. ;N        mov     edx, ICH6_REG_INTCTL
  1362. ;N        call    azx_writeb
  1363.  
  1364.         ;     int timeout = 5000;
  1365.         ;     while (azx_sd_readb(azx_dev, SD_CTL) & SD_CTL_DMA_START && --timeout) ;
  1366. ;Asper: Hangs system   [
  1367. ;*        mov     ecx, 5000
  1368. ;*.l1:
  1369. ;*        mov     edx, ICH6_REG_SD_CTL
  1370. ;*        call    azx_sd_readb
  1371. ;*        test    al, SD_CTL_DMA_START
  1372. ;*        jz      @f
  1373. ;*        dec     ecx
  1374. ;*        jnz     .l1
  1375. ;*@@:
  1376. ;*
  1377. ;*        pop     edx ecx ebx
  1378. ;Asper ]
  1379.  
  1380.         xor     eax, eax
  1381.         spin_unlock_irq
  1382.         ret
  1383.  
  1384. ;align 4
  1385. ;proc get_dev_info stdcall, p_info:dword ;deprecated
  1386. ;virtual at esi
  1387. ;        CTRL_INFO CTRL_INFO
  1388. ;end virtual
  1389. ;
  1390. ;        mov     esi, [p_info]
  1391. ;        mov     eax, [ctrl.int_line]
  1392. ;        mov     bx,  [ctrl.dev_id]
  1393. ;        shl     ebx, 16
  1394. ;        and     bx,  [ctrl.vendor]
  1395. ;        mov     ecx, [ctrl.pci_cmd]
  1396. ;        mov     edx, [ctrl.codec_mem_base] ;[ctrl.hda_lower_mem_base]
  1397. ;        mov     edi, [ctrl.ctrl_mem_base] ;[ctrl.hda_upper_mem_base]
  1398. ;
  1399. ;        mov     [CTRL_INFO.irq], eax
  1400. ;        mov     [CTRL_INFO.codec_id], ebx
  1401. ;        mov     [CTRL_INFO.pci_cmd], ecx
  1402. ;        mov     [CTRL_INFO.codec_mem_base], edx
  1403. ;        mov     [CTRL_INFO.ctrl_mem_base], edi
  1404. ;
  1405. ;        xor     eax, eax
  1406. ;        mov     [CTRL_INFO.codec_io_base], eax
  1407. ;        mov     [CTRL_INFO.ctrl_io_base], eax
  1408. ;        mov     [CTRL_INFO.glob_cntrl], eax
  1409. ;        mov     [CTRL_INFO.glob_sta], eax
  1410. ;        ret
  1411. ;endp
  1412.  
  1413. align 4
  1414. proc set_callback stdcall, handler:dword
  1415.         mov     eax, [handler]
  1416.         mov     [ctrl.user_callback], eax
  1417.         ret
  1418. endp
  1419.  
  1420.  
  1421.  
  1422. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1423. ;; Interface for HD codec ;;
  1424. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1425.  
  1426. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1427. ;; CORB / RIRB interface ;;
  1428. ;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1429.  
  1430. proc azx_alloc_cmd_io
  1431.         push    eax ecx edx
  1432.         ; single page (at least 4096 bytes) must suffice for both ringbuffers
  1433.         invoke  KernelAlloc, 4096
  1434.         mov     [ctrl.rb], eax
  1435.  
  1436.         mov     edi, eax
  1437.         mov     ecx, 4096/4
  1438.         xor     eax, eax
  1439.         cld
  1440.         rep     stosd
  1441.  
  1442.         pop     edx ecx eax
  1443.         ret
  1444. endp
  1445.  
  1446. proc azx_init_cmd_io
  1447.         spin_lock_irq
  1448.         pusha
  1449.         ; CORB set up
  1450.         mov     eax, [ctrl.rb]
  1451.         mov     ebx, eax
  1452.         invoke  GetPgAddr
  1453.         and     ebx, 0xFFF
  1454.         add     eax, ebx
  1455.         push    eax  ; save corb address
  1456.         mov     edx, ICH6_REG_CORBLBASE
  1457.         call    azx_writel
  1458.         xor     eax, eax
  1459.         mov     edx, ICH6_REG_CORBUBASE
  1460.         call    azx_writel
  1461.  
  1462.         ; set the corb size to 256 entries (ULI requires explicitly)
  1463.         mov     al, 0x02
  1464.         mov     edx, ICH6_REG_CORBSIZE
  1465.         call    azx_writeb
  1466.         ; set the corb write pointer to 0
  1467.         xor     ax, ax
  1468.         mov     edx, ICH6_REG_CORBWP
  1469.         call    azx_writew
  1470.         ; reset the corb hw read pointer
  1471.         mov     ax, ICH6_CORBRP_RST
  1472.         mov     edx, ICH6_REG_CORBRP
  1473.         call    azx_writew
  1474.         ; enable corb dma
  1475.         mov     al, ICH6_CORBCTL_RUN
  1476.         mov     edx, ICH6_REG_CORBCTL
  1477.         call    azx_writeb
  1478.  
  1479.         ; RIRB set up
  1480.         mov     [ctrl.rirb_rp], 0
  1481.         mov     [ctrl.rirb_wp], 0
  1482.         mov     [ctrl.rirb_cmd], 0
  1483.  
  1484.         pop     eax  ; restore corb address
  1485.         add     eax, 2048
  1486.         mov     edx, ICH6_REG_RIRBLBASE
  1487.         call    azx_writel
  1488.         xor     eax, eax
  1489.         mov     edx, ICH6_REG_RIRBUBASE
  1490.         call    azx_writel
  1491.  
  1492.         ; set the rirb size to 256 entries (ULI requires explicitly)
  1493.         mov     al, 0x02
  1494.         mov     edx, ICH6_REG_RIRBSIZE
  1495.         call    azx_writeb
  1496.         ; reset the rirb hw write pointer
  1497.         mov     ax, ICH6_RIRBWP_RST
  1498.         mov     edx, ICH6_REG_RIRBWP
  1499.         call    azx_writew
  1500.         ; set N=1, get RIRB response interrupt for new entry
  1501.         xor     ax, ax
  1502.         cmp     byte [driver_type], AZX_DRIVER_CTX
  1503.         jne     @f
  1504.         mov     ax, 0xC0-1
  1505.   @@:
  1506.         inc     ax
  1507.         mov     edx, ICH6_REG_RINTCNT
  1508.         call    azx_writew
  1509.         ; enable rirb dma and response irq
  1510.         mov     al, ICH6_RBCTL_DMA_EN or ICH6_RBCTL_IRQ_EN
  1511.         mov     edx, ICH6_REG_RIRBCTL
  1512.         call    azx_writeb
  1513.  
  1514.         popa
  1515.         spin_unlock_irq
  1516.         ret
  1517. endp
  1518.  
  1519. proc azx_free_cmd_io
  1520.         spin_lock_irq
  1521.         push    eax edx
  1522.         ; disable ringbuffer DMAs
  1523.         xor     al, al
  1524.         mov     edx, ICH6_REG_RIRBCTL
  1525.         call    azx_writeb
  1526.         mov     edx, ICH6_REG_CORBCTL
  1527.         call    azx_writeb
  1528.         pop     edx eax
  1529.         spin_unlock_irq
  1530.         ret
  1531. endp
  1532.  
  1533.  
  1534. ; send a command
  1535. proc azx_corb_send_cmd  stdcall, val:dword
  1536.         spin_lock_irq
  1537.         push    edx edi
  1538.         xor     eax, eax
  1539.         ; add command to corb
  1540.         mov     edx, ICH6_REG_CORBWP
  1541.         call    azx_readb
  1542.         inc     al
  1543.         inc     dword [ctrl.rirb_cmd]
  1544.         mov     edi, dword [ctrl.rb]
  1545.  
  1546.         push    eax
  1547.         shl     eax, 2 ;wp=wp*sizeof(corb entry)=wp*4
  1548.         add     edi, eax
  1549.         mov     eax, dword [val]
  1550.         stosd
  1551.         pop     eax
  1552.         mov     edx, ICH6_REG_CORBWP
  1553.         call    azx_writel
  1554.  
  1555.         pop     edi edx
  1556.         xor     eax, eax ;Asper+
  1557.         spin_unlock_irq
  1558.         ret
  1559. endp
  1560.  
  1561.  
  1562. ; retrieve RIRB entry - called from interrupt handler
  1563. proc azx_update_rirb
  1564.         pusha
  1565.         xor     eax, eax
  1566.         mov     edx, ICH6_REG_RIRBWP
  1567.         call    azx_readb ;call  azx_readw
  1568.  
  1569.         cmp     ax, [ctrl.rirb_wp]
  1570.         je      .done
  1571.         mov     [ctrl.rirb_wp], ax
  1572.         mov     bx, [ctrl.rirb_rp]
  1573.  
  1574. .l1:
  1575.         cmp     bx, [ctrl.rirb_wp]
  1576.         je      .l3
  1577.  
  1578.         inc     bl
  1579. .l2:
  1580.         cmp     bx, ICH6_MAX_RIRB_ENTRIES
  1581.         jl      @f
  1582.         sub     bx, ICH6_MAX_RIRB_ENTRIES
  1583.         jmp     .l2
  1584. @@:
  1585.  
  1586.         movzx   edx, bx
  1587.         shl     edx, 1 + 2 ; an RIRB entry is 8-bytes
  1588.         mov     esi, dword [ctrl.rb]
  1589.         add     esi, 2048
  1590.         add     esi, edx
  1591.         lodsd   ; res
  1592.         mov     edx, eax
  1593.         lodsd   ; res_ex
  1594.  
  1595.         test    eax, ICH6_RIRB_EX_UNSOL_EV
  1596.         jz      @f
  1597.         stdcall snd_hda_queue_unsol_event, edx, eax
  1598.         jmp     .l1
  1599. @@:
  1600.         mov     ecx, [ctrl.rirb_cmd]
  1601.         test    ecx, ecx
  1602.         jz      @f
  1603.         mov     [ctrl.rirb_res], edx
  1604.         dec     dword [ctrl.rirb_cmd]
  1605.         jmp     .l1
  1606. @@:
  1607. if DEBUG
  1608.         push    esi
  1609.         mov     esi, msgSpuriousResponce
  1610.         invoke  SysMsgBoardStr
  1611.         pop     esi
  1612. end if
  1613.         jmp     .l1
  1614. .l3:
  1615.         mov     [ctrl.rirb_rp], bx
  1616. .done:
  1617.         popa
  1618.         ret
  1619. endp
  1620.  
  1621. ; receive a response
  1622. proc azx_rirb_get_response
  1623. locals
  1624.         do_poll db 0
  1625. endl
  1626.  
  1627.         push    ebx ecx edx
  1628. .again:
  1629.         mov     ecx, 1000;+1000
  1630. .next_try:
  1631.         mov     al, [ctrl.polling_mode]
  1632.         test    al, al
  1633.         jnz     .poll
  1634.         mov     ah, [do_poll]
  1635.         test    ah, ah
  1636.         jz      @f
  1637. .poll:
  1638.         spin_lock_irq
  1639.         call    azx_update_rirb
  1640.         spin_unlock_irq
  1641. @@:
  1642.         mov     eax, [ctrl.rirb_cmd]
  1643.         test    eax, eax
  1644.         jnz     .l1
  1645.         mov     [ctrl.rirb_error], 0
  1646.         mov     al, [do_poll]
  1647.         test    al, al
  1648.         jnz     @f
  1649.         mov     [ctrl.poll_count], 0
  1650. @@:
  1651.         mov     eax, [ctrl.rirb_res] ; the last value
  1652.         jmp     .out
  1653. .l1:
  1654.         push    eax
  1655.         mov     eax, 2000  ; temporary workaround
  1656.         call    StallExec
  1657.         pop     eax
  1658.         dec     ecx
  1659.         jnz     .next_try
  1660. .no_next_try:
  1661.         mov     al, [ctrl.polling_mode]
  1662.         test    al, al
  1663.         jnz     .no_poll
  1664.  
  1665.         mov     al, [ctrl.poll_count]
  1666.         cmp     al, 2
  1667.         jge     .poll_count_overflow
  1668. if DEBUG
  1669.         push    eax esi
  1670.         mov     esi, msgGetResponceTimeout
  1671.         invoke  SysMsgBoardStr
  1672.         mov     esi, msgPollingCodecOnce
  1673.         invoke  SysMsgBoardStr
  1674.         pop     esi eax
  1675. end if
  1676.         mov     [do_poll], 1
  1677.         inc     [ctrl.poll_count]
  1678.         jmp     .again
  1679.  
  1680. .poll_count_overflow:
  1681. if DEBUG
  1682.         push    eax esi
  1683.         mov     esi, msgGetResponceTimeout
  1684.         invoke  SysMsgBoardStr
  1685.         mov     esi, msgSwitchToPollMode
  1686.         invoke  SysMsgBoardStr
  1687.         pop     esi eax
  1688. end if
  1689.         mov     [ctrl.polling_mode], 1
  1690.         jmp     .again
  1691.  
  1692. .no_poll:
  1693.  
  1694.         mov     al, [ctrl.polling_mode]
  1695.         test    al, al
  1696.         jz      @f
  1697.         mov     eax, -1
  1698.         jmp     .out
  1699. @@:
  1700.  
  1701.         ; a fatal communication error; need either to reset or to fallback
  1702.         ; to the single_cmd mode
  1703.         mov     [ctrl.rirb_error], 1
  1704.         ;Asper~ -?  [
  1705.         mov     [ctrl.response_reset], 1
  1706.         mov     eax, -1  ; give a chance to retry
  1707.         jmp     .out
  1708.         ;Asper~ -?  ]
  1709.  
  1710.         ;-? mov     [ctrl.single_cmd], 1
  1711.         mov     [ctrl.response_reset], 0
  1712.  
  1713.         ; release CORB/RIRB
  1714.         call    azx_free_cmd_io
  1715.         ; disable unsolicited responses
  1716.         mov     edx, ICH6_REG_GCTL
  1717.         call    azx_readl
  1718.         mov     ebx, ICH6_GCTL_UNSOL
  1719.         xor     ebx, -1
  1720.         and     eax, ebx
  1721.         mov     edx, ICH6_REG_GCTL
  1722.         call    azx_writel
  1723.         mov     eax, -1
  1724. .out:
  1725.         pop     edx ecx ebx
  1726.         ret
  1727. endp
  1728.  
  1729. ;
  1730. ; Use the single immediate command instead of CORB/RIRB for simplicity
  1731. ;
  1732. ; Note: according to Intel, this is not preferred use.  The command was
  1733. ;       intended for the BIOS only, and may get confused with unsolicited
  1734. ;       responses.  So, we shouldn't use it for normal operation from the
  1735. ;       driver.
  1736. ;       I left the codes, however, for debugging/testing purposes.
  1737. ;
  1738.  
  1739. ; receive a response
  1740. proc azx_single_wait_for_response
  1741.         push    ecx edx esi
  1742.  
  1743.         mov     ecx, 50
  1744. .l1:
  1745.         test    ecx, ecx
  1746.         jz      .timeout
  1747.  
  1748.         ; check IRV busy bit
  1749.         mov     edx, ICH6_REG_IRS
  1750.         call    azx_readw
  1751.         test    ax, ICH6_IRS_VALID
  1752.         jz      @f
  1753.         ; reuse rirb.res as the response return value
  1754.         mov     edx, ICH6_REG_IR
  1755.         call    azx_readl
  1756.         mov     [ctrl.rirb_res], eax
  1757.  
  1758.         pop     esi edx ecx
  1759.         xor     eax, eax
  1760.         ret
  1761. @@:
  1762.         xor     eax, eax
  1763.         inc     eax
  1764.         call    StallExec
  1765.  
  1766.         dec     ecx
  1767.         jmp     .l1
  1768. .timeout:
  1769. if DEBUG
  1770.         xor     eax, eax
  1771.         mov     edx, ICH6_REG_IRS
  1772.         call    azx_readw
  1773.         mov     esi, msgGetResponceTimeout
  1774.         invoke  SysMsgBoardStr
  1775.         mov     esi, msgIRS
  1776.         invoke  SysMsgBoardStr
  1777.         stdcall fdword2str, 2
  1778.         invoke  SysMsgBoardStr
  1779. end if
  1780.  
  1781.         pop     esi edx ecx
  1782.         mov     eax, -1
  1783.         mov     [ctrl.rirb_res], eax
  1784.         ret
  1785. endp
  1786.  
  1787. ; send a command
  1788. proc azx_single_send_cmd  stdcall, val:dword
  1789.         push    ecx edx esi
  1790.  
  1791.         mov     ecx, 50
  1792. .l1:
  1793.         test    ecx, ecx
  1794.         jz      .timeout
  1795.  
  1796.         ; check ICB busy bit
  1797.         mov     edx, ICH6_REG_IRS
  1798.         call    azx_readw
  1799.         test    ax, ICH6_IRS_BUSY
  1800.         jnz     @f
  1801.         ; Clear IRV valid bit
  1802.         mov     edx, ICH6_REG_IRS
  1803.         call    azx_readw
  1804.         or      ax, ICH6_IRS_VALID
  1805.         mov     edx, ICH6_REG_IRS
  1806.         call    azx_writew
  1807.  
  1808.         mov     eax, dword [val]
  1809.         mov     edx, ICH6_REG_IC
  1810.         call    azx_writel
  1811.  
  1812.         mov     edx, ICH6_REG_IRS
  1813.         call    azx_readw
  1814.         or      ax, ICH6_IRS_BUSY
  1815.         mov     edx, ICH6_REG_IRS
  1816.         call    azx_writew
  1817.  
  1818.         stdcall azx_single_wait_for_response
  1819.         pop     esi edx ecx
  1820.         ret
  1821. @@:
  1822.         dec     ecx
  1823.         jmp     .l1
  1824. .timeout:
  1825. if DEBUG
  1826.         xor     eax, eax
  1827.         mov     edx, ICH6_REG_IRS
  1828.         call    azx_readw
  1829.         mov     esi, msgSendCmdTimeout
  1830.         invoke  SysMsgBoardStr
  1831.         stdcall fdword2str, 2
  1832.         invoke  SysMsgBoardStr
  1833.         mov     esi, msgVal
  1834.         invoke  SysMsgBoardStr
  1835.         mov     eax, dword [val]
  1836.         stdcall fdword2str, 2
  1837.         invoke  SysMsgBoardStr
  1838. end if
  1839.  
  1840.         pop     esi edx ecx
  1841.         mov     eax, -1
  1842.         ret
  1843. endp
  1844.  
  1845. ; receive a response
  1846. proc azx_single_get_response
  1847.         mov     eax, [ctrl.rirb_res]
  1848.         ret
  1849. endp
  1850.  
  1851. ;
  1852. ; The below are the main callbacks from hda_codec.
  1853. ;
  1854. ; They are just the skeleton to call sub-callbacks according to the
  1855. ; current setting of chip->single_cmd.
  1856. ;
  1857.  
  1858. ; send a command
  1859. proc azx_send_cmd  stdcall, val:dword
  1860. if USE_SINGLE_MODE
  1861.         stdcall azx_single_send_cmd, [val]
  1862. else
  1863.         stdcall azx_corb_send_cmd, [val]
  1864. end if
  1865.         ret
  1866. endp
  1867.  
  1868. ; get a response
  1869. proc azx_get_response
  1870. if USE_SINGLE_MODE
  1871.         call    azx_single_get_response
  1872. else
  1873.         call    azx_rirb_get_response
  1874. end if
  1875.         ret
  1876. endp
  1877.  
  1878.  
  1879. ;;;;;;;;;;;;;;;;;;;;;;;;
  1880. ;; Lowlevel interface ;;
  1881. ;;;;;;;;;;;;;;;;;;;;;;;;
  1882.  
  1883. ; enable interrupts
  1884. proc azx_int_enable
  1885.         push     eax edx
  1886.         ; enable controller CIE and GIE
  1887.         mov     edx, ICH6_REG_INTCTL
  1888.         call    azx_readl
  1889.         or      eax, ICH6_INT_CTRL_EN or ICH6_INT_GLOBAL_EN
  1890.         mov     edx, ICH6_REG_INTCTL
  1891.         call    azx_writel
  1892.         pop     edx eax
  1893.         ret
  1894. endp
  1895.  
  1896. ; disable interrupts
  1897. proc azx_int_disable
  1898.         push    eax ebx edx
  1899.  
  1900.         ; disable interrupts in stream descriptor
  1901.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  1902.         call    azx_readb
  1903.         mov     bl, SD_INT_MASK
  1904.         xor     bl, -1
  1905.         and     al, bl
  1906.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  1907.         call    azx_writeb
  1908.  
  1909.         ; disable SIE for all streams
  1910.         xor     al, al
  1911.         mov     edx, ICH6_REG_INTCTL
  1912.         call    azx_writeb
  1913.  
  1914.         ; disable controller CIE and GIE
  1915.         mov     edx, ICH6_REG_INTCTL
  1916.         call    azx_readl
  1917.         mov     ebx, ICH6_INT_CTRL_EN or ICH6_INT_GLOBAL_EN
  1918.         xor     ebx, -1
  1919.         and     eax, ebx
  1920.         call    azx_writel
  1921.         pop     edx ebx eax
  1922.         ret
  1923. endp
  1924.  
  1925. ; clear interrupts
  1926. proc azx_int_clear
  1927.         push    eax edx
  1928.  
  1929.         ; clear stream status
  1930.         mov     al, SD_INT_MASK
  1931.         mov     edx, ICH6_REG_SD_STS + SDO_OFS
  1932.         call    azx_writeb
  1933.  
  1934.         ; clear STATESTS
  1935.         mov     al, STATESTS_INT_MASK
  1936.         mov     edx, ICH6_REG_STATESTS
  1937.         call    azx_writeb
  1938.  
  1939.         ; clear rirb status
  1940.         mov     al, RIRB_INT_MASK
  1941.         mov     edx, ICH6_REG_RIRBSTS
  1942.         call    azx_writeb
  1943.  
  1944.         ; clear int status
  1945.         mov     eax, ICH6_INT_CTRL_EN or ICH6_INT_ALL_STREAM
  1946.         mov     edx, ICH6_REG_INTSTS
  1947.         call    azx_writel
  1948.         pop     edx eax
  1949.         ret
  1950. endp
  1951.  
  1952.  
  1953. ; start a stream
  1954. proc azx_stream_start
  1955.         push    eax edx
  1956.  
  1957.         ; enable SIE
  1958.         mov     edx, ICH6_REG_INTCTL
  1959.         call    azx_readl
  1960.  
  1961.         or      eax, 0xC0000000 ;Asper+
  1962.         or      eax, SDO_INT  ; Asper: output stream interrupt index
  1963.         mov     edx, ICH6_REG_INTCTL
  1964.         call    azx_writel
  1965.         ; set DMA start and interrupt mask
  1966.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  1967.         call    azx_readb
  1968.  
  1969.         or      al, SD_CTL_DMA_START or SD_INT_MASK
  1970.  
  1971.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  1972.         call    azx_writeb
  1973.  
  1974.         pop     edx eax
  1975.         ret
  1976. endp
  1977.  
  1978. ; stop DMA
  1979. proc azx_stream_clear
  1980.         push    eax ebx edx
  1981.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  1982.         call    azx_readb
  1983.         mov     bl, SD_CTL_DMA_START or SD_INT_MASK
  1984.         xor     bl, -1
  1985.         and     al, bl
  1986.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  1987.         call    azx_writeb
  1988.         mov     al, SD_INT_MASK
  1989.         mov     edx, ICH6_REG_SD_STS + SDO_OFS
  1990.         call    azx_writeb
  1991.         pop     edx ebx eax
  1992.         ret
  1993. endp
  1994.  
  1995. ; stop a stream
  1996. proc azx_stream_stop
  1997.         push    eax ebx edx
  1998.         call    azx_stream_clear
  1999.         ; disable SIE
  2000.         mov     edx, ICH6_REG_INTCTL
  2001.         call    azx_readl
  2002.         mov     ebx, (SDO_INT)
  2003.         xor     ebx, -1
  2004.         and     eax, ebx
  2005.         mov     edx, ICH6_REG_INTCTL
  2006.         call    azx_writel
  2007.         pop     edx ebx eax
  2008.         ret
  2009. endp
  2010.  
  2011. ;
  2012. ;in: eax = full_reset
  2013. ;
  2014. ; initialize the chip
  2015. proc azx_init_chip
  2016.         push    eax
  2017.  
  2018.         ; reset controller
  2019.         mov     eax, 1 ;full reset
  2020.         call    reset_controller
  2021.  
  2022.         ; initialize interrupts
  2023.         call    azx_int_clear
  2024.         call    azx_int_enable
  2025.  
  2026.         ; initialize the codec command I/O
  2027. if USE_SINGLE_MODE
  2028. else
  2029.         call    azx_init_cmd_io
  2030. end if
  2031.  
  2032.         ; program the position buffer
  2033.         mov     eax, dword [ctrl.posbuf]
  2034.         mov     ebx, eax
  2035.         invoke  GetPgAddr
  2036.         and     ebx, 0xFFF
  2037.         add     eax, ebx
  2038.         mov     edx, ICH6_REG_DPLBASE
  2039.         call    azx_writel
  2040.         xor     eax, eax
  2041.         mov     edx, ICH6_REG_DPUBASE
  2042.         call    azx_writel
  2043.  
  2044.         pop     eax
  2045.         ret
  2046. endp
  2047.  
  2048.  
  2049. ; initialize the PCI registers
  2050.  
  2051. ; update bits in a PCI register byte
  2052. proc update_pci_byte  stdcall, reg:dword, mask:dword, val:dword
  2053.         push    ax bx
  2054.         invoke  PciRead8, [ctrl.bus], [ctrl.devfn], [reg]
  2055.         mov     bl, byte [mask]
  2056.         mov     bh, bl
  2057.         xor     bl, -1
  2058.         and     al, bl
  2059.         shr     bx, 8
  2060.         and     bl, byte [val]
  2061.         or      al, bl
  2062.         invoke  PciWrite8, [ctrl.bus], [ctrl.devfn], [reg], eax
  2063.         pop     bx ax
  2064.         ret
  2065. endp
  2066.  
  2067.  
  2068. proc azx_init_pci
  2069.         ; Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
  2070.         ; TCSEL == Traffic Class Select Register, which sets PCI express QOS
  2071.         ; Ensuring these bits are 0 clears playback static on some HD Audio
  2072.         ; codecs
  2073.         push    eax
  2074.         stdcall update_pci_byte, ICH6_PCIREG_TCSEL, 0x07, 0
  2075.  
  2076.         mov     eax, [driver_type]
  2077.         cmp     eax, AZX_DRIVER_ATI
  2078.         jne     @f
  2079.         ; For ATI SB450 azalia HD audio, we need to enable snoop
  2080.         stdcall update_pci_byte, ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, 0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP
  2081.         jmp     .done
  2082. @@:
  2083.         cmp     eax, AZX_DRIVER_NVIDIA
  2084.         jne     @f
  2085.         ; For NVIDIA HDA, enable snoop
  2086.         stdcall update_pci_byte, NVIDIA_HDA_TRANSREG_ADDR, 0x0f, NVIDIA_HDA_ENABLE_COHBITS
  2087.         stdcall update_pci_byte, NVIDIA_HDA_ISTRM_COH, 0x01, NVIDIA_HDA_ENABLE_COHBIT
  2088.         stdcall update_pci_byte, NVIDIA_HDA_OSTRM_COH, 0x01, NVIDIA_HDA_ENABLE_COHBIT
  2089.         jmp     .done
  2090. @@:
  2091.         cmp     eax, AZX_DRIVER_SCH
  2092.         je      .l1
  2093.         cmp     eax, AZX_DRIVER_PCH
  2094.         jne     @f
  2095. .l1:
  2096.         invoke  PciRead16,  [ctrl.bus], [ctrl.devfn], dword INTEL_SCH_HDA_DEVC
  2097.         test    ax, INTEL_SCH_HDA_DEVC_NOSNOOP
  2098.         jz      @f
  2099.         push    ebx
  2100.         mov     ebx, INTEL_SCH_HDA_DEVC_NOSNOOP
  2101.         xor     ebx, -1
  2102.         and     eax, ebx
  2103.         pop     ebx
  2104.         invoke  PciWrite16,  [ctrl.bus], [ctrl.devfn], dword INTEL_SCH_HDA_DEVC, eax
  2105.         invoke  PciRead16,  [ctrl.bus], [ctrl.devfn], dword INTEL_SCH_HDA_DEVC
  2106.  
  2107. if DEBUG
  2108.         push    esi
  2109.         mov     esi, msgHDASnoopDisabled
  2110.         invoke  SysMsgBoardStr
  2111.         mov     esi, msg_OK
  2112.         test    ax, INTEL_SCH_HDA_DEVC_NOSNOOP
  2113.         jz      .snoop_ok
  2114.         mov     esi, msg_Fail
  2115. .snoop_ok:
  2116.         invoke  SysMsgBoardStr
  2117.         pop     esi
  2118. end if
  2119. @@:
  2120. .done:
  2121.         pop     eax
  2122.         ret
  2123. endp
  2124.  
  2125.  
  2126. ; reset stream
  2127. proc azx_stream_reset
  2128.         push    eax ebx ecx edx
  2129.  
  2130.         call    azx_stream_clear
  2131.  
  2132.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2133.         call    azx_readb
  2134.         or      al, SD_CTL_STREAM_RESET
  2135.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2136.         call    azx_writeb
  2137.  
  2138.         mov     eax, 3
  2139.         call    StallExec
  2140.  
  2141.         mov     ecx, 300
  2142. .l1:
  2143.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2144.         call    azx_readb
  2145.         test    al, SD_CTL_STREAM_RESET
  2146.         jnz     @f
  2147.         dec     ecx
  2148.         jnz     .l1
  2149. @@:
  2150.         mov     bl, SD_CTL_STREAM_RESET
  2151.         xor     bl, -1
  2152.         and     al, bl
  2153.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2154.         call    azx_writeb
  2155.  
  2156.         mov     eax, 3
  2157.         call    StallExec
  2158.  
  2159.         mov     ecx, 300
  2160.         ; waiting for hardware to report that the stream is out of reset
  2161. .l2:
  2162.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2163.         call    azx_readb
  2164.         test    al, SD_CTL_STREAM_RESET
  2165.         jnz     @f
  2166.         dec     ecx
  2167.         jnz     .l2
  2168. @@:
  2169.         ; reset first position - may not be synced with hw at this time
  2170.         mov     edx, [ctrl.posbuf]
  2171.         mov     dword [edx], 0
  2172.         pop     edx ecx ebx eax
  2173.         ret
  2174. endp
  2175.  
  2176.  
  2177. ; set up the SD for streaming
  2178. proc azx_setup_controller
  2179.         push    eax ebx ecx edx
  2180.         ; make sure the run bit is zero for SD
  2181.         call    azx_stream_clear
  2182.  
  2183.         ; program the stream_tag
  2184.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2185.         call    azx_readl
  2186.         mov     ecx, SD_CTL_STREAM_TAG_MASK
  2187.         xor     ecx, -1
  2188.         and     eax, ecx
  2189.         mov     ecx, SDO_TAG
  2190.         shl     ecx, SD_CTL_STREAM_TAG_SHIFT
  2191.         or      eax, ecx
  2192.         ; Asper stream_tag = SDO_TAG
  2193.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2194.         call    azx_writel
  2195.  
  2196.         ; program the length of samples in cyclic buffer
  2197.         mov     eax, 0x4000*32
  2198.         mov     edx, ICH6_REG_SD_CBL + SDO_OFS
  2199.         call    azx_writel
  2200.  
  2201.         ; program the stream format
  2202.         ; this value needs to be the same as the one programmed
  2203.         mov     ax, 0x11
  2204.         mov     edx, ICH6_REG_SD_FORMAT + SDO_OFS
  2205.         call    azx_writew
  2206.  
  2207.         ; program the stream LVI (last valid index) of the BDL
  2208.         mov     eax, 32-1 ;4-1 ;2-1
  2209.         mov     [ctrl.lvi_reg], eax
  2210.         mov     edx, ICH6_REG_SD_LVI + SDO_OFS
  2211.         call    azx_writew
  2212.  
  2213.         ; program the BDL address
  2214.         ; lower BDL address
  2215.         mov     eax, [pcmout_bdl]
  2216.         mov     ebx, eax
  2217.         invoke  GetPgAddr
  2218.         and     ebx, 0xFFF
  2219.         add     eax, ebx
  2220.         mov     edx, ICH6_REG_SD_BDLPL + SDO_OFS
  2221.         call    azx_writel
  2222.         ; upper BDL address
  2223.         xor     eax, eax       ;upper_32bit(azx_dev->bdl_addr)
  2224.         mov     edx, ICH6_REG_SD_BDLPU + SDO_OFS
  2225.         call    azx_writel
  2226.  
  2227.         ; enable the position buffer
  2228.         cmp     [ctrl.position_fix], POS_FIX_LPIB
  2229.         jz      @f
  2230.         mov     edx, ICH6_REG_DPLBASE
  2231.         call    azx_readl
  2232.         and     eax, ICH6_DPLBASE_ENABLE
  2233.         jnz     @f
  2234.         mov     eax, dword [ctrl.posbuf]
  2235.         mov     ebx, eax
  2236.         invoke  GetPgAddr
  2237.         and     ebx, 0xFFF
  2238.         add     eax, ebx
  2239.         or      eax, ICH6_DPLBASE_ENABLE
  2240.         mov     edx, ICH6_REG_DPLBASE
  2241.         call    azx_writel
  2242. @@:
  2243.         ; set the interrupt enable bits in the descriptor control register
  2244.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2245.         call    azx_readl
  2246.         or      eax, SD_INT_MASK
  2247.         mov     edx, ICH6_REG_SD_CTL + SDO_OFS
  2248.         call    azx_writel
  2249.  
  2250.         pop     edx ecx ebx eax
  2251.         ret
  2252. endp
  2253.  
  2254.  
  2255. ;(...)
  2256.  
  2257. ; Probe the given codec address
  2258. proc probe_codec, addr:dword
  2259.         push    edx
  2260.         mov     eax, [addr]
  2261.         shl     eax, 28
  2262.         mov     edx, (AC_NODE_ROOT shl 20) or (AC_VERB_PARAMETERS shl 8) or AC_PAR_VENDOR_ID
  2263.         or      eax, edx
  2264.         stdcall azx_send_cmd, eax
  2265.         stdcall azx_get_response
  2266.  
  2267.         cmp     eax, -1
  2268.         je      .out
  2269.         mov     eax, [addr]
  2270.         mov     [codec.addr], eax ;Asper+
  2271. if DEBUG
  2272.         push    esi
  2273.         mov     esi, msgCodecOK
  2274.         invoke  SysMsgBoardStr
  2275.         mov     esi, msgCAd
  2276.         invoke  SysMsgBoardStr
  2277.         stdcall fdword2str, 3
  2278.         invoke  SysMsgBoardStr
  2279.         pop     esi
  2280. end if
  2281.         xor     eax, eax
  2282. .out:
  2283.         pop     edx
  2284.         ret
  2285. endp
  2286.  
  2287.  
  2288. proc  azx_bus_reset
  2289.         call    azx_stop_chip
  2290.         call    azx_init_chip
  2291. endp
  2292.  
  2293.  
  2294. ; Codec initialization
  2295. proc azx_codec_create
  2296.         push    ebx  ecx  edx
  2297.         ;(...)
  2298.         ; First try to probe all given codec slots
  2299.         ; Asper: We asume for now that max slots for codecs = 4
  2300.         xor     ecx, ecx
  2301.         xor     edx, edx
  2302.         inc     edx
  2303. .next_slot:
  2304.         test    edx, [ctrl.codec_mask]
  2305.         jz      @f
  2306.         stdcall probe_codec, ecx
  2307.         test    eax, eax
  2308.         jz      .init ;@f
  2309.         ; Some BIOSen give you wrong codec addresses that don't exist
  2310. if DEBUG
  2311.         mov     esi, msgCodecError
  2312.         invoke  SysMsgBoardStr
  2313. end if
  2314.         mov     ebx, edx
  2315.         xor     ebx, -1
  2316.         and     [ctrl.codec_mask], ebx
  2317.  
  2318.         ; More badly, accessing to a non-existing
  2319.         ; codec often screws up the controller chip,
  2320.         ; and disturbs the further communications.
  2321.         ; Thus if an error occurs during probing,
  2322.         ; better to reset the controller chip to
  2323.         ; get back to the sanity state.
  2324.         ;call    azx_bus_reset
  2325. @@:
  2326.         shl     edx, 1
  2327.         inc     ecx
  2328. ;if USE_FIRST_CODEC
  2329. ;        cmp     ecx, 1
  2330. ;else
  2331.         cmp     ecx, 4
  2332. ;end if
  2333.         jl      .next_slot
  2334.         mov     eax, -1
  2335.         jmp     .out
  2336. .init:
  2337.         push    ecx edx
  2338.         stdcall snd_hda_codec_init
  2339.         pop     edx ecx
  2340.         test    eax, eax
  2341.         jnz     @b
  2342. .out:
  2343.         pop     edx  ecx  ebx
  2344.         ret
  2345. endp
  2346.  
  2347.  
  2348. proc azx_codec_configure
  2349.         ;(...)
  2350.         call    snd_hda_codec_configure
  2351.         ret
  2352. endp
  2353.  
  2354.  
  2355. proc azx_get_position
  2356.         test    [ctrl.position_fix], POS_FIX_LPIB
  2357.         jz      @f
  2358.         ; read LPIB
  2359.         mov     edx, ICH6_REG_SD_LPIB + SDO_OFS
  2360.         call    azx_readl
  2361.         jmp     .out
  2362. @@:
  2363.         test    [ctrl.position_fix], POS_FIX_VIACOMBO
  2364.         jz      @f
  2365. ;        call    azx_get_via_position
  2366. ;        jmp     .out
  2367. @@:
  2368.         ; use the position buffer
  2369.         push    edx
  2370.         mov     edx, dword [ctrl.posbuf]
  2371.         mov     eax, dword [edx]
  2372.         pop     edx
  2373. .out:
  2374.         cmp     eax, 0x4000 ; bufsize
  2375.         jl      @f
  2376.         xor     eax, eax
  2377. @@:
  2378.         ret
  2379. endp
  2380.  
  2381.  
  2382. proc azx_stop_chip
  2383.         push    eax edx
  2384.  
  2385.         ; disable interrupts
  2386.         call    azx_int_disable
  2387.         call    azx_int_clear
  2388.  
  2389.         ; disable CORB/RIRB
  2390.         call    azx_free_cmd_io
  2391.  
  2392.         ; disable position buffer
  2393.         xor     eax, eax
  2394.         mov     edx, ICH6_REG_DPLBASE
  2395.         call    azx_writel
  2396.         mov     edx, ICH6_REG_DPUBASE
  2397.         call    azx_writel
  2398.         pop     edx eax
  2399.         ret
  2400. endp
  2401.  
  2402.  
  2403. ; in:  eax = volume (-10000 - 0)
  2404. align 4
  2405. set_master_vol:
  2406.         mov     ecx, 3
  2407.         call    set_channel_volume
  2408.         ret
  2409.  
  2410.  
  2411. ; out:  [pvol] = volume (-10000 - 0)
  2412. align 4
  2413. proc  get_master_vol stdcall, pvol:dword
  2414.         xor     ecx, ecx
  2415.         call    get_channel_volume
  2416.         mov     ebx, [pvol]
  2417.         mov     [ebx], eax
  2418.         xor     eax, eax
  2419.         ret
  2420. endp
  2421.  
  2422.  
  2423. ; in:   ecx = channel mask (1 - Left; 2 - Right; 3-Both)
  2424. ;       eax = volume (-10000 - 0)
  2425. align 4
  2426. set_channel_volume:
  2427.         push    eax ebx ecx edx
  2428.         mov     ebx, [volume.maxDb]
  2429.         neg     eax
  2430. if DEBUG ;-
  2431.         push    eax esi
  2432.         mov     esi, msgNewVolume
  2433.         invoke  SysMsgBoardStr
  2434.         stdcall fdword2str, 2
  2435.         invoke  SysMsgBoardStr
  2436.  
  2437.         mov     esi, msgMinVolume
  2438.         invoke  SysMsgBoardStr
  2439.         mov     eax, ebx
  2440.         stdcall fdword2str, 2
  2441.         invoke  SysMsgBoardStr
  2442.         pop     esi eax
  2443. end if
  2444.         test    ebx, ebx
  2445.         jz      .err_out
  2446.  
  2447.         cmp     eax, 0
  2448.         jg      @f
  2449.         xor     eax, eax
  2450.         jmp     .set
  2451. @@:
  2452.         cmp     eax, ebx
  2453.         jng     .set
  2454.         mov     eax, ebx
  2455. .set:
  2456.         sub     ebx, eax
  2457.         mov     eax, ebx
  2458.         ;cdq
  2459.         xor     edx, edx
  2460.         push    eax
  2461.         movzx   eax, [volume.step_size]
  2462.         imul    eax, (100/4)
  2463.         mov     ebx, eax
  2464.         pop     eax
  2465.         xor     edx, edx
  2466.         idiv    ebx
  2467.  
  2468.         mov     edx, [volume.out_amp_node]
  2469.         test    edx, edx
  2470.         jz      .out
  2471.         movzx   ebx, [edx+HDA_GNODE.nid]
  2472.  
  2473.         test    ecx, 1   ; Left channel ?
  2474.         jz      @f
  2475.         stdcall put_volume_mute, ebx, 0, HDA_OUTPUT, 0, eax
  2476. @@:
  2477.         test    ecx, 2   ; Right channel ?
  2478.         jz      .out
  2479.         stdcall put_volume_mute, ebx, 1, HDA_OUTPUT, 0, eax
  2480. .out:
  2481.         pop     edx ecx ebx eax
  2482.         ret
  2483. .err_out:
  2484. if DEBUG  ;-
  2485.         push    esi
  2486.         mov     esi, emsgNoVolCtrl
  2487.         invoke  SysMsgBoardStr
  2488.         pop     esi
  2489. end if
  2490.         jmp     .out
  2491.  
  2492. ; in:   ecx = channel (1 - Left; 2 - Right)
  2493. ; out:  eax = volume (-10000 - 0)
  2494. align 4
  2495. get_channel_volume:
  2496.         push    ebx ecx edx
  2497.         cmp     ecx, 2
  2498.         jg      .out
  2499.         dec     cl
  2500.         xor     eax, eax
  2501.         mov     edx, [volume.out_amp_node]
  2502.         test    edx, edx
  2503.         jz      .out
  2504.         movzx   ebx, [edx+HDA_GNODE.nid]
  2505.         stdcall get_volume_mute, ebx, ecx, HDA_OUTPUT, 0
  2506.         and     eax, 0x7F ;get gain
  2507.         mov     cl, [volume.step_size]
  2508.         mul     cl
  2509.         imul    eax, (-100/4)
  2510. .out:
  2511.         pop     edx ecx ebx
  2512.         ret
  2513.  
  2514.  
  2515. ; in:  ecx = delay
  2516. udelay:
  2517.         push    eax ecx edx
  2518.         test    ecx, ecx
  2519.         jnz     @f
  2520.         inc     ecx
  2521. @@:
  2522.         mov     eax, ecx
  2523.         mov     cx, 500
  2524.         mul     cl
  2525.         mov     ecx, edx
  2526.         shl     ecx, 16
  2527.         or      ecx, eax
  2528. @@:
  2529.         xor     eax, eax
  2530.         cpuid
  2531.         dec     ecx
  2532.         jz      @b
  2533.         pop     edx ecx eax
  2534.         ret
  2535.  
  2536. align 4
  2537. proc StallExec
  2538.         push    ecx edx ebx eax
  2539.  
  2540.         mov     ecx, CPU_FREQ
  2541.         mul     ecx
  2542.         mov     ebx, eax       ;low
  2543.         mov     ecx, edx       ;high
  2544.         rdtsc
  2545.         add     ebx, eax
  2546.         adc     ecx,edx
  2547. @@:
  2548.         rdtsc
  2549.         sub     eax, ebx
  2550.         sbb     edx, ecx
  2551.         js      @B
  2552.  
  2553.         pop     eax ebx edx ecx
  2554.         ret
  2555. endp
  2556.  
  2557. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2558. ;         MEMORY MAPPED IO    (os depended) ;
  2559. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2560.  
  2561. align 4
  2562. proc azx_readb
  2563.         add     edx, [ctrl.ctrl_mem_base]
  2564.         mov     al, [edx]
  2565.         ret
  2566. endp
  2567.  
  2568. align 4
  2569. proc azx_readw
  2570.         add     edx, [ctrl.ctrl_mem_base]
  2571.         mov     ax, [edx]
  2572.         ret
  2573. endp
  2574.  
  2575. align 4
  2576. proc azx_readl
  2577.         add     edx, [ctrl.ctrl_mem_base]
  2578.         mov     eax, [edx]
  2579.         ret
  2580. endp
  2581.  
  2582. align 4
  2583. proc azx_writeb
  2584.         add     edx, [ctrl.ctrl_mem_base]
  2585.         mov     [edx], al
  2586.         ret
  2587. endp
  2588.  
  2589. align 4
  2590. proc azx_writew
  2591.         add     edx, [ctrl.ctrl_mem_base]
  2592.         mov     [edx], ax
  2593.         ret
  2594. endp
  2595.  
  2596. align 4
  2597. proc azx_writel
  2598.         add     edx, [ctrl.ctrl_mem_base]
  2599.         mov     [edx], eax
  2600.         ret
  2601. endp
  2602.  
  2603. ;_______
  2604.  
  2605.  
  2606. ;Asper remember to add this functions:
  2607. proc  snd_hda_queue_unsol_event stdcall, par1:dword, par2:dword
  2608. if DEBUG
  2609.         push    esi
  2610.         mov     esi, msgUnsolEvent
  2611.         invoke  SysMsgBoardStr
  2612.         pop     esi
  2613. end if
  2614. if USE_UNSOL_EV = 0
  2615.         ;Test. Do not make queue, process immediately!
  2616.         ;stdcall here snd_hda_read_pin_sense stdcall, nid:dword, trigger_sense:dword
  2617.         ;and then mute/unmute pin based on the results
  2618. end if
  2619.         ret
  2620. endp
  2621. ;...
  2622.  
  2623.  
  2624. align 4
  2625. proc  fdword2str stdcall, flags:dword   ; bit 0 - skipLeadZeroes; bit 1 - newLine; other bits undefined
  2626.         push    eax ebx ecx
  2627.         mov     esi, hex_buff
  2628.         mov     ecx, -8
  2629.         push    eax
  2630. @@:
  2631.         rol     eax, 4
  2632.         mov     ebx, eax
  2633.         and     ebx, 0x0F
  2634.         mov     bl, [ebx+hexletters]
  2635.         mov     [8+esi+ecx], bl
  2636.         inc     ecx
  2637.         jnz     @b
  2638.         pop     eax
  2639.  
  2640.         mov     dword [esi+8], 0
  2641.         test    [flags], 0x2 ; new line ?
  2642.         jz      .no_newline
  2643.         mov     dword [esi+8], 0x00000A0D
  2644. .no_newline:
  2645.  
  2646.         push    eax
  2647.         test    [flags], 0x1 ; skip zero bits ?
  2648.         jz      .no_skipz
  2649.         mov     ecx, 8
  2650. @@:
  2651.         test    eax, 0xF0000000
  2652.         jnz     .skipz_done
  2653.         rol     eax, 4
  2654.         inc     esi
  2655.         dec     ecx
  2656.         jnz     @b
  2657.         dec     esi
  2658. .skipz_done:
  2659. .no_skipz:
  2660.         pop     eax
  2661.  
  2662.         pop     ecx ebx eax
  2663.         ret
  2664. endp
  2665.  
  2666. hexletters   db '0123456789ABCDEF'
  2667. hex_buff     db 8 dup(0),13,10,0,0
  2668.  
  2669.  
  2670. include "CODEC.INC"
  2671. include "hda_generic.inc"
  2672.  
  2673. align 4
  2674. devices:
  2675. ; Intel
  2676.         dd (CTRL_INTEL_SCH2    shl 16)+VID_INTEL,msg_INTEL_SCH2,           AZX_DRIVER_SCH
  2677.         dd (CTRL_INTEL_HPT     shl 16)+VID_INTEL,msg_INTEL_HPT,            AZX_DRIVER_SCH
  2678.         dd (CTRL_INTEL_CPT     shl 16)+VID_INTEL,msg_INTEL_CPT,            AZX_DRIVER_PCH
  2679.         dd (CTRL_INTEL_PGB     shl 16)+VID_INTEL,msg_INTEL_PGB,            AZX_DRIVER_PCH
  2680.         dd (CTRL_INTEL_PPT1    shl 16)+VID_INTEL,msg_INTEL_PPT1,           AZX_DRIVER_PCH
  2681.         dd (CTRL_INTEL_82801F  shl 16)+VID_INTEL,msg_INTEL_82801F,         AZX_DRIVER_ICH
  2682.         dd (CTRL_INTEL_63XXESB shl 16)+VID_INTEL,msg_INTEL_63XXESB,        AZX_DRIVER_ICH
  2683.         dd (CTRL_INTEL_82801G  shl 16)+VID_INTEL,msg_INTEL_82801G,         AZX_DRIVER_ICH
  2684.         dd (CTRL_INTEL_82801H  shl 16)+VID_INTEL,msg_INTEL_82801H,         AZX_DRIVER_ICH
  2685.         dd (CTRL_INTEL_82801_UNK1  shl 16)+VID_INTEL,msg_INTEL_82801_UNK1, AZX_DRIVER_ICH
  2686.         dd (CTRL_INTEL_82801I  shl 16)+VID_INTEL,msg_INTEL_82801I,         AZX_DRIVER_ICH
  2687.         dd (CTRL_INTEL_82801_UNK2  shl 16)+VID_INTEL,msg_INTEL_82801_UNK2, AZX_DRIVER_ICH
  2688.         dd (CTRL_INTEL_82801JI shl 16)+VID_INTEL,msg_INTEL_82801JI,        AZX_DRIVER_ICH
  2689.         dd (CTRL_INTEL_82801JD shl 16)+VID_INTEL,msg_INTEL_82801JD,        AZX_DRIVER_ICH
  2690.         dd (CTRL_INTEL_PCH     shl 16)+VID_INTEL,msg_INTEL_PCH,            AZX_DRIVER_PCH
  2691.         dd (CTRL_INTEL_PCH2    shl 16)+VID_INTEL,msg_INTEL_PCH2,           AZX_DRIVER_PCH
  2692.         dd (CTRL_INTEL_SCH     shl 16)+VID_INTEL,msg_INTEL_SCH,            AZX_DRIVER_SCH
  2693.         dd (CTRL_INTEL_LPT     shl 16)+VID_INTEL,msg_INTEL_LPT,            AZX_DRIVER_PCH
  2694. ; Nvidia
  2695.         dd (CTRL_NVIDIA_MCP51    shl 16)+VID_NVIDIA,msg_NVIDIA_MCP51,      AZX_DRIVER_NVIDIA
  2696.         dd (CTRL_NVIDIA_MCP55    shl 16)+VID_NVIDIA,msg_NVIDIA_MCP55,      AZX_DRIVER_NVIDIA
  2697.         dd (CTRL_NVIDIA_MCP61_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP61,      AZX_DRIVER_NVIDIA
  2698.         dd (CTRL_NVIDIA_MCP61_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP61,      AZX_DRIVER_NVIDIA
  2699.         dd (CTRL_NVIDIA_MCP65_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP65,      AZX_DRIVER_NVIDIA
  2700.         dd (CTRL_NVIDIA_MCP65_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP65,      AZX_DRIVER_NVIDIA
  2701.         dd (CTRL_NVIDIA_MCP67_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP67,      AZX_DRIVER_NVIDIA
  2702.         dd (CTRL_NVIDIA_MCP67_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP67,      AZX_DRIVER_NVIDIA
  2703.         dd (CTRL_NVIDIA_MCP73_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP73,      AZX_DRIVER_NVIDIA
  2704.         dd (CTRL_NVIDIA_MCP73_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP73,      AZX_DRIVER_NVIDIA
  2705.         dd (CTRL_NVIDIA_MCP78_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP78,      AZX_DRIVER_NVIDIA
  2706.         dd (CTRL_NVIDIA_MCP78_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP78,      AZX_DRIVER_NVIDIA
  2707.         dd (CTRL_NVIDIA_MCP78_3  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP78,      AZX_DRIVER_NVIDIA
  2708.         dd (CTRL_NVIDIA_MCP78_4  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP78,      AZX_DRIVER_NVIDIA
  2709.         dd (CTRL_NVIDIA_MCP79_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP79,      AZX_DRIVER_NVIDIA
  2710.         dd (CTRL_NVIDIA_MCP79_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP79,      AZX_DRIVER_NVIDIA
  2711.         dd (CTRL_NVIDIA_MCP79_3  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP79,      AZX_DRIVER_NVIDIA
  2712.         dd (CTRL_NVIDIA_MCP79_4  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP79,      AZX_DRIVER_NVIDIA
  2713.         dd (CTRL_NVIDIA_0BE2     shl 16)+VID_NVIDIA,msg_NVIDIA_0BE2,       AZX_DRIVER_NVIDIA
  2714.         dd (CTRL_NVIDIA_0BE3     shl 16)+VID_NVIDIA,msg_NVIDIA_0BE3,       AZX_DRIVER_NVIDIA
  2715.         dd (CTRL_NVIDIA_0BE4     shl 16)+VID_NVIDIA,msg_NVIDIA_0BE4,       AZX_DRIVER_NVIDIA
  2716.         dd (CTRL_NVIDIA_GT100    shl 16)+VID_NVIDIA,msg_NVIDIA_GT100,      AZX_DRIVER_NVIDIA
  2717.         dd (CTRL_NVIDIA_GT106    shl 16)+VID_NVIDIA,msg_NVIDIA_GT106,      AZX_DRIVER_NVIDIA
  2718.         dd (CTRL_NVIDIA_GT108    shl 16)+VID_NVIDIA,msg_NVIDIA_GT108,      AZX_DRIVER_NVIDIA
  2719.         dd (CTRL_NVIDIA_GT104    shl 16)+VID_NVIDIA,msg_NVIDIA_GT104,      AZX_DRIVER_NVIDIA
  2720.         dd (CTRL_NVIDIA_GT116    shl 16)+VID_NVIDIA,msg_NVIDIA_GT116,      AZX_DRIVER_NVIDIA
  2721.         dd (CTRL_NVIDIA_MCP89_1  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP89,      AZX_DRIVER_NVIDIA
  2722.         dd (CTRL_NVIDIA_MCP89_2  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP89,      AZX_DRIVER_NVIDIA
  2723.         dd (CTRL_NVIDIA_MCP89_3  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP89,      AZX_DRIVER_NVIDIA
  2724.         dd (CTRL_NVIDIA_MCP89_4  shl 16)+VID_NVIDIA,msg_NVIDIA_MCP89,      AZX_DRIVER_NVIDIA
  2725.         dd (CTRL_NVIDIA_GF119    shl 16)+VID_NVIDIA,msg_NVIDIA_GF119,      AZX_DRIVER_NVIDIA
  2726.         dd (CTRL_NVIDIA_GF110_1  shl 16)+VID_NVIDIA,msg_NVIDIA_GF110,      AZX_DRIVER_NVIDIA
  2727.         dd (CTRL_NVIDIA_GF110_2  shl 16)+VID_NVIDIA,msg_NVIDIA_GF110,      AZX_DRIVER_NVIDIA
  2728. ; ATI
  2729.         dd (CTRL_ATI_SB450  shl 16)+VID_ATI,msg_ATI_SB450,                 AZX_DRIVER_ATI
  2730.         dd (CTRL_ATI_SB600  shl 16)+VID_ATI,msg_ATI_SB600,                 AZX_DRIVER_ATI
  2731.         dd (CTRL_ATI_RS600  shl 16)+VID_ATI,msg_ATI_RS600,                 AZX_DRIVER_ATIHDMI
  2732.         dd (CTRL_ATI_RS690  shl 16)+VID_ATI,msg_ATI_RS690,                 AZX_DRIVER_ATIHDMI
  2733.         dd (CTRL_ATI_RS780  shl 16)+VID_ATI,msg_ATI_RS780,                 AZX_DRIVER_ATIHDMI
  2734.         dd (CTRL_ATI_RS_UNK1  shl 16)+VID_ATI,msg_ATI_RS_UNK1,             AZX_DRIVER_ATIHDMI
  2735.         dd (CTRL_ATI_R600   shl 16)+VID_ATI,msg_ATI_R600,                  AZX_DRIVER_ATIHDMI
  2736.         dd (CTRL_ATI_RV610  shl 16)+VID_ATI,msg_ATI_RV610,                 AZX_DRIVER_ATIHDMI
  2737.         dd (CTRL_ATI_RV620  shl 16)+VID_ATI,msg_ATI_RV620,                 AZX_DRIVER_ATIHDMI
  2738.         dd (CTRL_ATI_RV630  shl 16)+VID_ATI,msg_ATI_RV630,                 AZX_DRIVER_ATIHDMI
  2739.         dd (CTRL_ATI_RV635  shl 16)+VID_ATI,msg_ATI_RV635,                 AZX_DRIVER_ATIHDMI
  2740.         dd (CTRL_ATI_RV670  shl 16)+VID_ATI,msg_ATI_RV670,                 AZX_DRIVER_ATIHDMI
  2741.         dd (CTRL_ATI_RV710  shl 16)+VID_ATI,msg_ATI_RV710,                 AZX_DRIVER_ATIHDMI
  2742.         dd (CTRL_ATI_RV730  shl 16)+VID_ATI,msg_ATI_RV730,                 AZX_DRIVER_ATIHDMI
  2743.         dd (CTRL_ATI_RV740  shl 16)+VID_ATI,msg_ATI_RV740,                 AZX_DRIVER_ATIHDMI
  2744.         dd (CTRL_ATI_RV770  shl 16)+VID_ATI,msg_ATI_RV770,                 AZX_DRIVER_ATIHDMI
  2745. ; AMD
  2746.         dd (CTRL_AMD_HUDSON shl 16)+VID_AMD,msg_AMD_HUDSON,                AZX_DRIVER_GENERIC
  2747. ; VIA
  2748.         dd (CTRL_VIA_VT82XX shl 16)+VID_VIA,msg_VIA_VT82XX,                AZX_DRIVER_VIA
  2749.         dd (CTRL_VIA_VT61XX shl 16)+VID_VIA,msg_VIA_VT61XX,                AZX_DRIVER_GENERIC
  2750.         dd (CTRL_VIA_VT71XX shl 16)+VID_VIA,msg_VIA_VT71XX,                AZX_DRIVER_GENERIC
  2751. ; SiS
  2752.         dd (CTRL_SIS_966    shl 16)+VID_SIS,msg_SIS_966,                   AZX_DRIVER_SIS
  2753. ; ULI
  2754.         dd (CTRL_ULI_M5461  shl 16)+VID_ULI,msg_ULI_M5461,                 AZX_DRIVER_ULI
  2755. ; Teradici
  2756.         dd (CTRL_TERA_UNK1  shl 16)+VID_ULI,msg_TERA_UNK1,                 AZX_DRIVER_TERA
  2757. ; Creative
  2758.         dd (CTRL_CREATIVE_CA0110_IBG     shl 16)+VID_CREATIVE,msg_CREATIVE_CA0110_IBG,   AZX_DRIVER_CTX
  2759.         dd (CTRL_CREATIVE_SOUND_CORE3D_1 shl 16)+VID_CREATIVE,msg_CREATIVE_SOUND_CORE3D, AZX_DRIVER_GENERIC
  2760.         dd (CTRL_CREATIVE_SOUND_CORE3D_2 shl 16)+VID_CREATIVE,msg_CREATIVE_SOUND_CORE3D, AZX_DRIVER_GENERIC
  2761. ; RDC Semiconductor
  2762.         dd (CTRL_RDC_R3010  shl 16)+VID_RDC,msg_RDC_R3010,                 AZX_DRIVER_GENERIC
  2763. ; VMware
  2764.         dd (CTRL_VMWARE_UNK1  shl 16)+VID_VMWARE,msg_VMWARE_UNK1,          AZX_DRIVER_GENERIC
  2765.  
  2766.         dd 0    ;terminator
  2767.  
  2768.  
  2769. version      dd (5 shl 16) or (API_VERSION and 0xFFFF)
  2770.  
  2771. msg_Intel               db 'Intel ',0
  2772. msg_INTEL_CPT           db 'Cougar Point',13,10,0
  2773. msg_INTEL_PGB           db 'Patsburg',13,10,0
  2774. msg_INTEL_PPT1          db 'Panther Point',13,10,0
  2775. msg_INTEL_LPT           db 'Lynx Point',13,10,0
  2776. msg_INTEL_HPT           db 'Haswell',13,10,0
  2777. msg_INTEL_82801F        db '82801F',13,10,0
  2778. msg_INTEL_63XXESB       db '631x/632xESB',13,10,0
  2779. msg_INTEL_82801G        db '82801G', 13,10,0
  2780. msg_INTEL_82801H        db '82801H', 13,10,0
  2781. msg_INTEL_82801I        db '82801I', 13,10,0
  2782. msg_INTEL_82801JI       db '82801JI',13,10,0
  2783. msg_INTEL_82801JD       db '82801JD',13,10,0
  2784. msg_INTEL_PCH           db 'PCH',13,10,0
  2785. msg_INTEL_PCH2          db 'PCH2',13,10,0
  2786. msg_INTEL_SCH           db 'Poulsbo',13,10,0
  2787. msg_INTEL_SCH2          db 'Oaktrail',13,10,0
  2788. msg_INTEL_82801_UNK1    db '82801_UNK1',  13,10,0
  2789. msg_INTEL_82801_UNK2    db '82801_UNK2',  13,10,0
  2790.  
  2791. msg_NVidia              db 'NVidia ',0
  2792. msg_NVIDIA_MCP51        db 'MCP51',      13,10,0
  2793. msg_NVIDIA_MCP55        db 'MCP55',      13,10,0
  2794. msg_NVIDIA_MCP61        db 'MCP61',      13,10,0
  2795. msg_NVIDIA_MCP65        db 'MCP65',      13,10,0
  2796. msg_NVIDIA_MCP67        db 'MCP67',      13,10,0
  2797. msg_NVIDIA_MCP73        db 'MCP73',      13,10,0
  2798. msg_NVIDIA_MCP78        db 'MCP78',      13,10,0
  2799. msg_NVIDIA_MCP79        db 'MCP79',      13,10,0
  2800. msg_NVIDIA_MCP89        db 'MCP89',      13,10,0
  2801. msg_NVIDIA_0BE2         db '(0x0be2)',   13,10,0
  2802. msg_NVIDIA_0BE3         db '(0x0be3)',   13,10,0
  2803. msg_NVIDIA_0BE4         db '(0x0be4)',   13,10,0
  2804. msg_NVIDIA_GT100        db 'GT100',      13,10,0
  2805. msg_NVIDIA_GT104        db 'GT104',      13,10,0
  2806. msg_NVIDIA_GT106        db 'GT106',      13,10,0
  2807. msg_NVIDIA_GT108        db 'GT108',      13,10,0
  2808. msg_NVIDIA_GT116        db 'GT116',      13,10,0
  2809. msg_NVIDIA_GF119        db 'GF119',      13,10,0
  2810. msg_NVIDIA_GF110        db 'GF110',      13,10,0
  2811.  
  2812. msg_ATI              db 'ATI ',0
  2813. msg_ATI_SB450        db 'SB450',      13,10,0
  2814. msg_ATI_SB600        db 'SB600',      13,10,0
  2815.  
  2816. msg_ATI_HDMI         db 'ATI HDMI ',0
  2817. msg_ATI_RS600        db 'RS600',      13,10,0
  2818. msg_ATI_RS690        db 'RS690',      13,10,0
  2819. msg_ATI_RS780        db 'RS780',      13,10,0
  2820. msg_ATI_RS_UNK1      db 'RS_UNK1',    13,10,0
  2821. msg_ATI_R600         db 'R600',       13,10,0
  2822. msg_ATI_RV610        db 'RV610',      13,10,0
  2823. msg_ATI_RV620        db 'RV620',      13,10,0
  2824. msg_ATI_RV630        db 'RV630',      13,10,0
  2825. msg_ATI_RV635        db 'RV635',      13,10,0
  2826. msg_ATI_RV670        db 'RV670',      13,10,0
  2827. msg_ATI_RV710        db 'RV710',      13,10,0
  2828. msg_ATI_RV730        db 'RV730',      13,10,0
  2829. msg_ATI_RV740        db 'RV740',      13,10,0
  2830. msg_ATI_RV770        db 'RV770',      13,10,0
  2831.  
  2832. msg_AMD              db 'AMD ',0
  2833. msg_AMD_HUDSON       db 'Hudson',     13,10,0
  2834.  
  2835. msg_VIA              db 'VIA ',0
  2836. msg_VIA_VT82XX       db 'VT8251/8237A',     13,10,0
  2837. msg_VIA_VT61XX       db 'GFX VT6122/VX11',  13,10,0
  2838. msg_VIA_VT71XX       db 'GFX VT7122/VX900', 13,10,0
  2839.  
  2840. msg_SIS              db 'SIS ',0
  2841. msg_SIS_966          db '966',      13,10,0
  2842.  
  2843. msg_ULI              db 'ULI ',0
  2844. msg_ULI_M5461        db 'M5461',      13,10,0
  2845.  
  2846. msg_TERA             db 'Teradici ',0
  2847. msg_TERA_UNK1        db 'UNK1',      13,10,0
  2848.  
  2849. msg_CREATIVE                  db 'Creative ',0
  2850. msg_CREATIVE_CA0110_IBG       db 'CA0110-IBG',13,10,0 ;SB X-Fi Xtreme Audio
  2851. msg_CREATIVE_SOUND_CORE3D     db 'Sound Core3D'
  2852.  
  2853. msg_RDC              db 'RDC ',0
  2854. msg_RDC_R3010        db 'R3010', 13,10,0
  2855.  
  2856. msg_VMWARE           db 'VMware ',0
  2857. msg_VMWARE_UNK1      db 'UNK1', 13,10,0
  2858.  
  2859. szKernel             db 'KERNEL',0
  2860. sz_sound_srv         db 'SOUND',0
  2861.  
  2862. msgInit      db 'detect hardware...',13,10,0
  2863. msgFail      db 'device not found',13,10,0
  2864. msgAttchIRQ  db 'IRQ line not supported', 13,10,0
  2865. msgInvIRQ    db 'IRQ line not assigned or invalid', 13,10,0
  2866. msgPlay      db 'start play', 13,10,0
  2867. msgStop      db 'stop play',  13,10,0
  2868. msgSetChannelVolume  db 'Set Channel Volume', 13,10,0
  2869. msgIRQ       db 'HDA IRQ', 13,10,0
  2870. msgInitCtrl  db 'init controller',13,10,0
  2871. msgPrimBuff  db 'create primary buffer ...',0
  2872. msgDone      db 'done',13,10,0
  2873. msgRemap     db 'Remap IRQ',13,10,0
  2874. msgOk        db 'service installed',13,10,0
  2875. msgCold      db 'cold reset',13,10,0
  2876.     msgHDARFail    db 'controller not ready',13,10,0
  2877. msgCFail     db 'codec not ready',13,10,0
  2878. msgResetOk   db 'reset complete',13,10,0
  2879. msgPciCmd    db 'PCI command     ',0
  2880. msgPciStat   db 'PCI status      ',0
  2881.     msgHDALowMMIo db 'lower mmio base ',0
  2882.     msgHDAUpMMIo  db 'upper mmio base ',0
  2883. msgIrqMap    db 'HDA irq map as      ',0
  2884.  
  2885. ;Asper [
  2886. if DEBUG
  2887.     msgCodecMask             db 'codec_mask = ',0
  2888.     msgNoCodecsFound         db 'no codecs found!',13,10,0
  2889.     msgHDASnoopDisabled      db 'HDA snoop disabled, enabling ... ',0
  2890.     msg_OK                   db 'OK',13,10,0
  2891.     msg_Fail                 db 'Failed',13,10,0
  2892.     msgSpuriousResponce      db 'spurious responce ',0
  2893.     emsgInvalidAFGSubtree    db 'Invalid AFG subtree',13,10,0
  2894.     emsgConnListNotAvailable db 'connection list not available for ',0
  2895.     msgUnmuteOut             db 'UNMUTE OUT: NID=',0
  2896.     msgUnmuteIn              db 'UNMUTE IN: NID=',0
  2897.     msgGetResponceTimeout    db 'get_response timeout: ',0
  2898.     msgVal                   db ' val=',0
  2899.     emsgBusResetFatalComm    db 'resetting BUS due to fatal communication error',13,10,0
  2900.     msgCodecOK               db 'codec probed OK',13,10,0
  2901.     msgCodecError            db 'codec probe error disabling it...',13,10,0
  2902.     emsgNoAFGorMFGFound      db 'no AFG or MFG node found',13,10,0
  2903.     msgNoAFGFound            db 'no AFG node found, trying another codec',13,10,0
  2904.     emsgNoMem                db 'hda_codec: cannot malloc',13,10,0
  2905.     msgConnect               db 'CONNECT: NID=',0
  2906.     msgIdx                   db ' IDX=',0
  2907.     msgSkipDigitalOutNode    db 'Skip Digital OUT node ',0
  2908.     msgAudOutFound           db 'AUD_OUT found ',0
  2909.     emsgNoParserAvailable    db 'No codec parser is available',13,10,0
  2910.     emsgNoProperOutputPathFound  db 'hda_generic: no proper output path found',13,10,0
  2911.     emsgInvConnList          db 'hda_codec: invalid CONNECT_LIST verb ',0
  2912.     emsgInvDepRangeVal       db 'hda_codec: invalid dep_range_val ',0
  2913.     emsgTooManyConns         db 'Too many connections',13,10,0
  2914.         emsgNoVolCtrl        db 'No volume control',13,10,0
  2915.     msgHDACodecSetupStream   db 'hda_codec_setup_stream: NID=',0
  2916.     msgStream                db 'stream=',0
  2917.     msgChannel               db 'channel=',0
  2918.     msgFormat                db 'format=',0
  2919.  
  2920.     msgPollingCodecOnce      db 'polling the codec once',13,10,0 ;Asper~
  2921.     msgSwitchToPollMode      db 'switching to polling mode',13,10,0 ;Asper~
  2922.  
  2923.     msgUnsolEvent            db 'Unsolicited event!',13,10,0
  2924.     strSemicolon             db ':',0
  2925.     msgSETUP_FG_NODES        db 'Setup FG nodes = start_nid:total_nodes = ',0
  2926.     msgFG_TYPE               db 'FG type = ',0
  2927.     msgPinCfgs               db 'Pin configurations:',13,10,0
  2928.     msgWCaps                 db 'Widget capabilities:',13,10,0
  2929.     msgCAd                   db 'CAd = ',0
  2930.     msgTCSEL                 db 'PCI TCSEL     ',0
  2931.     msgTV                    db 'HDA test version ',TEST_VERSION_NUMBER,13,10,0
  2932.     msgGCap                  db 'GCAP = ',0
  2933. end if
  2934.  
  2935. if USE_SINGLE_MODE
  2936.     msgSingleMode            db 'Single mode !',13,10,0
  2937.     msgIRS                   db 'IRS=',0
  2938.     msgSendCmdTimeout        db 'send_cmd timeout: IRS=',0
  2939. else
  2940.     msgNormalMode            db 'Normal mode !',13,10,0
  2941. end if
  2942.  
  2943. if DEBUG
  2944.     msgYAHOO2                db 'YAHOO2: ',0
  2945.     msgMinVolume             db 'MinVolume: ',0
  2946.     msgNewVolume             db 'NewVolume: ',0
  2947.  
  2948.     msgVerbQuery             db 'Q: ',0
  2949.     msgVerbAnswer            db 'A: ',0
  2950.     msgPin_Nid               db 'Pin Nid = ',0
  2951.     msgPin_Ctl               db 'Pin Control = ',0
  2952.     msgPin_Caps              db 'Pin Capabilities = ',0
  2953.     msgDef_Cfg               db 'Pin def_cfg = ',0
  2954.     msgAmp_Out_Caps          db 'Pin Amp Out caps = ',0
  2955.     msgAmpVal                db 'Amp val = ',0
  2956.     msgEnableEAPD            db 'Enable EAPD: NID=',0
  2957.     msgBeeperNid             db 'Beeper found: NID=',0
  2958.     msgBeeperValue           db 'Beeper initial value: ',0
  2959.     msgBeepNow               db 'Beep!',13,10,0
  2960.  
  2961.     msgNodeSeq               db 'Sequence of codec nodes:',13,10,0
  2962.     msgNID                   db 'NID: 0x',0
  2963. end if
  2964.  
  2965. ;] Asper
  2966.  
  2967. aspinlock        dd SPINLOCK_FREE
  2968.  
  2969. codec CODEC
  2970. ctrl AC_CNTRL
  2971.  
  2972. ;Asper: BDL must be aligned to 128 according to HDA specification.
  2973. pcmout_bdl       rd 1
  2974. buff_list        rd 32
  2975.  
  2976. driver_type      rd 1
  2977.