Subversion Repositories Kolibri OS

Rev

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

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