2
0

ac97.c 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437
  1. /*
  2. * Copyright (C) 2006 InnoTek Systemberatung GmbH
  3. *
  4. * This file is part of VirtualBox Open Source Edition (OSE), as
  5. * available from http://www.virtualbox.org. This file is free software;
  6. * you can redistribute it and/or modify it under the terms of the GNU
  7. * General Public License as published by the Free Software Foundation,
  8. * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
  9. * distribution. VirtualBox OSE is distributed in the hope that it will
  10. * be useful, but WITHOUT ANY WARRANTY of any kind.
  11. *
  12. * If you received this file as part of a commercial VirtualBox
  13. * distribution, then only the terms of your commercial VirtualBox
  14. * license agreement apply instead of the previous paragraph.
  15. *
  16. * Contributions after 2012-01-13 are licensed under the terms of the
  17. * GNU GPL, version 2 or (at your option) any later version.
  18. */
  19. #include "qemu/osdep.h"
  20. #include "hw/audio/soundhw.h"
  21. #include "audio/audio.h"
  22. #include "hw/pci/pci.h"
  23. #include "hw/qdev-properties.h"
  24. #include "migration/vmstate.h"
  25. #include "qemu/module.h"
  26. #include "sysemu/dma.h"
  27. #include "qom/object.h"
  28. enum {
  29. AC97_Reset = 0x00,
  30. AC97_Master_Volume_Mute = 0x02,
  31. AC97_Headphone_Volume_Mute = 0x04,
  32. AC97_Master_Volume_Mono_Mute = 0x06,
  33. AC97_Master_Tone_RL = 0x08,
  34. AC97_PC_BEEP_Volume_Mute = 0x0A,
  35. AC97_Phone_Volume_Mute = 0x0C,
  36. AC97_Mic_Volume_Mute = 0x0E,
  37. AC97_Line_In_Volume_Mute = 0x10,
  38. AC97_CD_Volume_Mute = 0x12,
  39. AC97_Video_Volume_Mute = 0x14,
  40. AC97_Aux_Volume_Mute = 0x16,
  41. AC97_PCM_Out_Volume_Mute = 0x18,
  42. AC97_Record_Select = 0x1A,
  43. AC97_Record_Gain_Mute = 0x1C,
  44. AC97_Record_Gain_Mic_Mute = 0x1E,
  45. AC97_General_Purpose = 0x20,
  46. AC97_3D_Control = 0x22,
  47. AC97_AC_97_RESERVED = 0x24,
  48. AC97_Powerdown_Ctrl_Stat = 0x26,
  49. AC97_Extended_Audio_ID = 0x28,
  50. AC97_Extended_Audio_Ctrl_Stat = 0x2A,
  51. AC97_PCM_Front_DAC_Rate = 0x2C,
  52. AC97_PCM_Surround_DAC_Rate = 0x2E,
  53. AC97_PCM_LFE_DAC_Rate = 0x30,
  54. AC97_PCM_LR_ADC_Rate = 0x32,
  55. AC97_MIC_ADC_Rate = 0x34,
  56. AC97_6Ch_Vol_C_LFE_Mute = 0x36,
  57. AC97_6Ch_Vol_L_R_Surround_Mute = 0x38,
  58. AC97_Vendor_Reserved = 0x58,
  59. AC97_Sigmatel_Analog = 0x6c, /* We emulate a Sigmatel codec */
  60. AC97_Sigmatel_Dac2Invert = 0x6e, /* We emulate a Sigmatel codec */
  61. AC97_Vendor_ID1 = 0x7c,
  62. AC97_Vendor_ID2 = 0x7e
  63. };
  64. #define SOFT_VOLUME
  65. #define SR_FIFOE 16 /* rwc */
  66. #define SR_BCIS 8 /* rwc */
  67. #define SR_LVBCI 4 /* rwc */
  68. #define SR_CELV 2 /* ro */
  69. #define SR_DCH 1 /* ro */
  70. #define SR_VALID_MASK ((1 << 5) - 1)
  71. #define SR_WCLEAR_MASK (SR_FIFOE | SR_BCIS | SR_LVBCI)
  72. #define SR_RO_MASK (SR_DCH | SR_CELV)
  73. #define SR_INT_MASK (SR_FIFOE | SR_BCIS | SR_LVBCI)
  74. #define CR_IOCE 16 /* rw */
  75. #define CR_FEIE 8 /* rw */
  76. #define CR_LVBIE 4 /* rw */
  77. #define CR_RR 2 /* rw */
  78. #define CR_RPBM 1 /* rw */
  79. #define CR_VALID_MASK ((1 << 5) - 1)
  80. #define CR_DONT_CLEAR_MASK (CR_IOCE | CR_FEIE | CR_LVBIE)
  81. #define GC_WR 4 /* rw */
  82. #define GC_CR 2 /* rw */
  83. #define GC_VALID_MASK ((1 << 6) - 1)
  84. #define GS_MD3 (1<<17) /* rw */
  85. #define GS_AD3 (1<<16) /* rw */
  86. #define GS_RCS (1<<15) /* rwc */
  87. #define GS_B3S12 (1<<14) /* ro */
  88. #define GS_B2S12 (1<<13) /* ro */
  89. #define GS_B1S12 (1<<12) /* ro */
  90. #define GS_S1R1 (1<<11) /* rwc */
  91. #define GS_S0R1 (1<<10) /* rwc */
  92. #define GS_S1CR (1<<9) /* ro */
  93. #define GS_S0CR (1<<8) /* ro */
  94. #define GS_MINT (1<<7) /* ro */
  95. #define GS_POINT (1<<6) /* ro */
  96. #define GS_PIINT (1<<5) /* ro */
  97. #define GS_RSRVD ((1<<4)|(1<<3))
  98. #define GS_MOINT (1<<2) /* ro */
  99. #define GS_MIINT (1<<1) /* ro */
  100. #define GS_GSCI 1 /* rwc */
  101. #define GS_RO_MASK (GS_B3S12| \
  102. GS_B2S12| \
  103. GS_B1S12| \
  104. GS_S1CR| \
  105. GS_S0CR| \
  106. GS_MINT| \
  107. GS_POINT| \
  108. GS_PIINT| \
  109. GS_RSRVD| \
  110. GS_MOINT| \
  111. GS_MIINT)
  112. #define GS_VALID_MASK ((1 << 18) - 1)
  113. #define GS_WCLEAR_MASK (GS_RCS|GS_S1R1|GS_S0R1|GS_GSCI)
  114. #define BD_IOC (1<<31)
  115. #define BD_BUP (1<<30)
  116. #define EACS_VRA 1
  117. #define EACS_VRM 8
  118. #define MUTE_SHIFT 15
  119. #define TYPE_AC97 "AC97"
  120. OBJECT_DECLARE_SIMPLE_TYPE(AC97LinkState, AC97)
  121. #define REC_MASK 7
  122. enum {
  123. REC_MIC = 0,
  124. REC_CD,
  125. REC_VIDEO,
  126. REC_AUX,
  127. REC_LINE_IN,
  128. REC_STEREO_MIX,
  129. REC_MONO_MIX,
  130. REC_PHONE
  131. };
  132. typedef struct BD {
  133. uint32_t addr;
  134. uint32_t ctl_len;
  135. } BD;
  136. typedef struct AC97BusMasterRegs {
  137. uint32_t bdbar; /* rw 0 */
  138. uint8_t civ; /* ro 0 */
  139. uint8_t lvi; /* rw 0 */
  140. uint16_t sr; /* rw 1 */
  141. uint16_t picb; /* ro 0 */
  142. uint8_t piv; /* ro 0 */
  143. uint8_t cr; /* rw 0 */
  144. unsigned int bd_valid;
  145. BD bd;
  146. } AC97BusMasterRegs;
  147. struct AC97LinkState {
  148. PCIDevice dev;
  149. QEMUSoundCard card;
  150. uint32_t glob_cnt;
  151. uint32_t glob_sta;
  152. uint32_t cas;
  153. uint32_t last_samp;
  154. AC97BusMasterRegs bm_regs[3];
  155. uint8_t mixer_data[256];
  156. SWVoiceIn *voice_pi;
  157. SWVoiceOut *voice_po;
  158. SWVoiceIn *voice_mc;
  159. int invalid_freq[3];
  160. uint8_t silence[128];
  161. int bup_flag;
  162. MemoryRegion io_nam;
  163. MemoryRegion io_nabm;
  164. };
  165. enum {
  166. BUP_SET = 1,
  167. BUP_LAST = 2
  168. };
  169. #ifdef DEBUG_AC97
  170. #define dolog(...) AUD_log ("ac97", __VA_ARGS__)
  171. #else
  172. #define dolog(...)
  173. #endif
  174. #define MKREGS(prefix, start) \
  175. enum { \
  176. prefix ## _BDBAR = start, \
  177. prefix ## _CIV = start + 4, \
  178. prefix ## _LVI = start + 5, \
  179. prefix ## _SR = start + 6, \
  180. prefix ## _PICB = start + 8, \
  181. prefix ## _PIV = start + 10, \
  182. prefix ## _CR = start + 11 \
  183. }
  184. enum {
  185. PI_INDEX = 0,
  186. PO_INDEX,
  187. MC_INDEX,
  188. LAST_INDEX
  189. };
  190. MKREGS (PI, PI_INDEX * 16);
  191. MKREGS (PO, PO_INDEX * 16);
  192. MKREGS (MC, MC_INDEX * 16);
  193. enum {
  194. GLOB_CNT = 0x2c,
  195. GLOB_STA = 0x30,
  196. CAS = 0x34
  197. };
  198. #define GET_BM(index) (((index) >> 4) & 3)
  199. static void po_callback (void *opaque, int free);
  200. static void pi_callback (void *opaque, int avail);
  201. static void mc_callback (void *opaque, int avail);
  202. static void warm_reset (AC97LinkState *s)
  203. {
  204. (void) s;
  205. }
  206. static void cold_reset (AC97LinkState * s)
  207. {
  208. (void) s;
  209. }
  210. static void fetch_bd (AC97LinkState *s, AC97BusMasterRegs *r)
  211. {
  212. uint8_t b[8];
  213. pci_dma_read (&s->dev, r->bdbar + r->civ * 8, b, 8);
  214. r->bd_valid = 1;
  215. r->bd.addr = le32_to_cpu (*(uint32_t *) &b[0]) & ~3;
  216. r->bd.ctl_len = le32_to_cpu (*(uint32_t *) &b[4]);
  217. r->picb = r->bd.ctl_len & 0xffff;
  218. dolog ("bd %2d addr=%#x ctl=%#06x len=%#x(%d bytes)\n",
  219. r->civ, r->bd.addr, r->bd.ctl_len >> 16,
  220. r->bd.ctl_len & 0xffff,
  221. (r->bd.ctl_len & 0xffff) << 1);
  222. }
  223. static void update_sr (AC97LinkState *s, AC97BusMasterRegs *r, uint32_t new_sr)
  224. {
  225. int event = 0;
  226. int level = 0;
  227. uint32_t new_mask = new_sr & SR_INT_MASK;
  228. uint32_t old_mask = r->sr & SR_INT_MASK;
  229. uint32_t masks[] = {GS_PIINT, GS_POINT, GS_MINT};
  230. if (new_mask ^ old_mask) {
  231. /** @todo is IRQ deasserted when only one of status bits is cleared? */
  232. if (!new_mask) {
  233. event = 1;
  234. level = 0;
  235. }
  236. else {
  237. if ((new_mask & SR_LVBCI) && (r->cr & CR_LVBIE)) {
  238. event = 1;
  239. level = 1;
  240. }
  241. if ((new_mask & SR_BCIS) && (r->cr & CR_IOCE)) {
  242. event = 1;
  243. level = 1;
  244. }
  245. }
  246. }
  247. r->sr = new_sr;
  248. dolog ("IOC%d LVB%d sr=%#x event=%d level=%d\n",
  249. r->sr & SR_BCIS, r->sr & SR_LVBCI,
  250. r->sr,
  251. event, level);
  252. if (!event)
  253. return;
  254. if (level) {
  255. s->glob_sta |= masks[r - s->bm_regs];
  256. dolog ("set irq level=1\n");
  257. pci_irq_assert(&s->dev);
  258. }
  259. else {
  260. s->glob_sta &= ~masks[r - s->bm_regs];
  261. dolog ("set irq level=0\n");
  262. pci_irq_deassert(&s->dev);
  263. }
  264. }
  265. static void voice_set_active (AC97LinkState *s, int bm_index, int on)
  266. {
  267. switch (bm_index) {
  268. case PI_INDEX:
  269. AUD_set_active_in (s->voice_pi, on);
  270. break;
  271. case PO_INDEX:
  272. AUD_set_active_out (s->voice_po, on);
  273. break;
  274. case MC_INDEX:
  275. AUD_set_active_in (s->voice_mc, on);
  276. break;
  277. default:
  278. AUD_log ("ac97", "invalid bm_index(%d) in voice_set_active", bm_index);
  279. break;
  280. }
  281. }
  282. static void reset_bm_regs (AC97LinkState *s, AC97BusMasterRegs *r)
  283. {
  284. dolog ("reset_bm_regs\n");
  285. r->bdbar = 0;
  286. r->civ = 0;
  287. r->lvi = 0;
  288. /** todo do we need to do that? */
  289. update_sr (s, r, SR_DCH);
  290. r->picb = 0;
  291. r->piv = 0;
  292. r->cr = r->cr & CR_DONT_CLEAR_MASK;
  293. r->bd_valid = 0;
  294. voice_set_active (s, r - s->bm_regs, 0);
  295. memset (s->silence, 0, sizeof (s->silence));
  296. }
  297. static void mixer_store (AC97LinkState *s, uint32_t i, uint16_t v)
  298. {
  299. if (i + 2 > sizeof (s->mixer_data)) {
  300. dolog ("mixer_store: index %d out of bounds %zd\n",
  301. i, sizeof (s->mixer_data));
  302. return;
  303. }
  304. s->mixer_data[i + 0] = v & 0xff;
  305. s->mixer_data[i + 1] = v >> 8;
  306. }
  307. static uint16_t mixer_load (AC97LinkState *s, uint32_t i)
  308. {
  309. uint16_t val = 0xffff;
  310. if (i + 2 > sizeof (s->mixer_data)) {
  311. dolog ("mixer_load: index %d out of bounds %zd\n",
  312. i, sizeof (s->mixer_data));
  313. }
  314. else {
  315. val = s->mixer_data[i + 0] | (s->mixer_data[i + 1] << 8);
  316. }
  317. return val;
  318. }
  319. static void open_voice (AC97LinkState *s, int index, int freq)
  320. {
  321. struct audsettings as;
  322. as.freq = freq;
  323. as.nchannels = 2;
  324. as.fmt = AUDIO_FORMAT_S16;
  325. as.endianness = 0;
  326. if (freq > 0) {
  327. s->invalid_freq[index] = 0;
  328. switch (index) {
  329. case PI_INDEX:
  330. s->voice_pi = AUD_open_in (
  331. &s->card,
  332. s->voice_pi,
  333. "ac97.pi",
  334. s,
  335. pi_callback,
  336. &as
  337. );
  338. break;
  339. case PO_INDEX:
  340. s->voice_po = AUD_open_out (
  341. &s->card,
  342. s->voice_po,
  343. "ac97.po",
  344. s,
  345. po_callback,
  346. &as
  347. );
  348. break;
  349. case MC_INDEX:
  350. s->voice_mc = AUD_open_in (
  351. &s->card,
  352. s->voice_mc,
  353. "ac97.mc",
  354. s,
  355. mc_callback,
  356. &as
  357. );
  358. break;
  359. }
  360. }
  361. else {
  362. s->invalid_freq[index] = freq;
  363. switch (index) {
  364. case PI_INDEX:
  365. AUD_close_in (&s->card, s->voice_pi);
  366. s->voice_pi = NULL;
  367. break;
  368. case PO_INDEX:
  369. AUD_close_out (&s->card, s->voice_po);
  370. s->voice_po = NULL;
  371. break;
  372. case MC_INDEX:
  373. AUD_close_in (&s->card, s->voice_mc);
  374. s->voice_mc = NULL;
  375. break;
  376. }
  377. }
  378. }
  379. static void reset_voices (AC97LinkState *s, uint8_t active[LAST_INDEX])
  380. {
  381. uint16_t freq;
  382. freq = mixer_load (s, AC97_PCM_LR_ADC_Rate);
  383. open_voice (s, PI_INDEX, freq);
  384. AUD_set_active_in (s->voice_pi, active[PI_INDEX]);
  385. freq = mixer_load (s, AC97_PCM_Front_DAC_Rate);
  386. open_voice (s, PO_INDEX, freq);
  387. AUD_set_active_out (s->voice_po, active[PO_INDEX]);
  388. freq = mixer_load (s, AC97_MIC_ADC_Rate);
  389. open_voice (s, MC_INDEX, freq);
  390. AUD_set_active_in (s->voice_mc, active[MC_INDEX]);
  391. }
  392. static void get_volume (uint16_t vol, uint16_t mask, int inverse,
  393. int *mute, uint8_t *lvol, uint8_t *rvol)
  394. {
  395. *mute = (vol >> MUTE_SHIFT) & 1;
  396. *rvol = (255 * (vol & mask)) / mask;
  397. *lvol = (255 * ((vol >> 8) & mask)) / mask;
  398. if (inverse) {
  399. *rvol = 255 - *rvol;
  400. *lvol = 255 - *lvol;
  401. }
  402. }
  403. static void update_combined_volume_out (AC97LinkState *s)
  404. {
  405. uint8_t lvol, rvol, plvol, prvol;
  406. int mute, pmute;
  407. get_volume (mixer_load (s, AC97_Master_Volume_Mute), 0x3f, 1,
  408. &mute, &lvol, &rvol);
  409. get_volume (mixer_load (s, AC97_PCM_Out_Volume_Mute), 0x1f, 1,
  410. &pmute, &plvol, &prvol);
  411. mute = mute | pmute;
  412. lvol = (lvol * plvol) / 255;
  413. rvol = (rvol * prvol) / 255;
  414. AUD_set_volume_out (s->voice_po, mute, lvol, rvol);
  415. }
  416. static void update_volume_in (AC97LinkState *s)
  417. {
  418. uint8_t lvol, rvol;
  419. int mute;
  420. get_volume (mixer_load (s, AC97_Record_Gain_Mute), 0x0f, 0,
  421. &mute, &lvol, &rvol);
  422. AUD_set_volume_in (s->voice_pi, mute, lvol, rvol);
  423. }
  424. static void set_volume (AC97LinkState *s, int index, uint32_t val)
  425. {
  426. switch (index) {
  427. case AC97_Master_Volume_Mute:
  428. val &= 0xbf3f;
  429. mixer_store (s, index, val);
  430. update_combined_volume_out (s);
  431. break;
  432. case AC97_PCM_Out_Volume_Mute:
  433. val &= 0x9f1f;
  434. mixer_store (s, index, val);
  435. update_combined_volume_out (s);
  436. break;
  437. case AC97_Record_Gain_Mute:
  438. val &= 0x8f0f;
  439. mixer_store (s, index, val);
  440. update_volume_in (s);
  441. break;
  442. }
  443. }
  444. static void record_select (AC97LinkState *s, uint32_t val)
  445. {
  446. uint8_t rs = val & REC_MASK;
  447. uint8_t ls = (val >> 8) & REC_MASK;
  448. mixer_store (s, AC97_Record_Select, rs | (ls << 8));
  449. }
  450. static void mixer_reset (AC97LinkState *s)
  451. {
  452. uint8_t active[LAST_INDEX];
  453. dolog ("mixer_reset\n");
  454. memset (s->mixer_data, 0, sizeof (s->mixer_data));
  455. memset (active, 0, sizeof (active));
  456. mixer_store (s, AC97_Reset , 0x0000); /* 6940 */
  457. mixer_store (s, AC97_Headphone_Volume_Mute , 0x0000);
  458. mixer_store (s, AC97_Master_Volume_Mono_Mute , 0x0000);
  459. mixer_store (s, AC97_Master_Tone_RL, 0x0000);
  460. mixer_store (s, AC97_PC_BEEP_Volume_Mute , 0x0000);
  461. mixer_store (s, AC97_Phone_Volume_Mute , 0x0000);
  462. mixer_store (s, AC97_Mic_Volume_Mute , 0x0000);
  463. mixer_store (s, AC97_Line_In_Volume_Mute , 0x0000);
  464. mixer_store (s, AC97_CD_Volume_Mute , 0x0000);
  465. mixer_store (s, AC97_Video_Volume_Mute , 0x0000);
  466. mixer_store (s, AC97_Aux_Volume_Mute , 0x0000);
  467. mixer_store (s, AC97_Record_Gain_Mic_Mute , 0x0000);
  468. mixer_store (s, AC97_General_Purpose , 0x0000);
  469. mixer_store (s, AC97_3D_Control , 0x0000);
  470. mixer_store (s, AC97_Powerdown_Ctrl_Stat , 0x000f);
  471. /*
  472. * Sigmatel 9700 (STAC9700)
  473. */
  474. mixer_store (s, AC97_Vendor_ID1 , 0x8384);
  475. mixer_store (s, AC97_Vendor_ID2 , 0x7600); /* 7608 */
  476. mixer_store (s, AC97_Extended_Audio_ID , 0x0809);
  477. mixer_store (s, AC97_Extended_Audio_Ctrl_Stat, 0x0009);
  478. mixer_store (s, AC97_PCM_Front_DAC_Rate , 0xbb80);
  479. mixer_store (s, AC97_PCM_Surround_DAC_Rate , 0xbb80);
  480. mixer_store (s, AC97_PCM_LFE_DAC_Rate , 0xbb80);
  481. mixer_store (s, AC97_PCM_LR_ADC_Rate , 0xbb80);
  482. mixer_store (s, AC97_MIC_ADC_Rate , 0xbb80);
  483. record_select (s, 0);
  484. set_volume (s, AC97_Master_Volume_Mute, 0x8000);
  485. set_volume (s, AC97_PCM_Out_Volume_Mute, 0x8808);
  486. set_volume (s, AC97_Record_Gain_Mute, 0x8808);
  487. reset_voices (s, active);
  488. }
  489. /**
  490. * Native audio mixer
  491. * I/O Reads
  492. */
  493. static uint32_t nam_readb (void *opaque, uint32_t addr)
  494. {
  495. AC97LinkState *s = opaque;
  496. dolog ("U nam readb %#x\n", addr);
  497. s->cas = 0;
  498. return ~0U;
  499. }
  500. static uint32_t nam_readw (void *opaque, uint32_t addr)
  501. {
  502. AC97LinkState *s = opaque;
  503. uint32_t index = addr;
  504. s->cas = 0;
  505. return mixer_load(s, index);
  506. }
  507. static uint32_t nam_readl (void *opaque, uint32_t addr)
  508. {
  509. AC97LinkState *s = opaque;
  510. dolog ("U nam readl %#x\n", addr);
  511. s->cas = 0;
  512. return ~0U;
  513. }
  514. /**
  515. * Native audio mixer
  516. * I/O Writes
  517. */
  518. static void nam_writeb (void *opaque, uint32_t addr, uint32_t val)
  519. {
  520. AC97LinkState *s = opaque;
  521. dolog ("U nam writeb %#x <- %#x\n", addr, val);
  522. s->cas = 0;
  523. }
  524. static void nam_writew (void *opaque, uint32_t addr, uint32_t val)
  525. {
  526. AC97LinkState *s = opaque;
  527. uint32_t index = addr;
  528. s->cas = 0;
  529. switch (index) {
  530. case AC97_Reset:
  531. mixer_reset (s);
  532. break;
  533. case AC97_Powerdown_Ctrl_Stat:
  534. val &= ~0x800f;
  535. val |= mixer_load (s, index) & 0xf;
  536. mixer_store (s, index, val);
  537. break;
  538. case AC97_PCM_Out_Volume_Mute:
  539. case AC97_Master_Volume_Mute:
  540. case AC97_Record_Gain_Mute:
  541. set_volume (s, index, val);
  542. break;
  543. case AC97_Record_Select:
  544. record_select (s, val);
  545. break;
  546. case AC97_Vendor_ID1:
  547. case AC97_Vendor_ID2:
  548. dolog ("Attempt to write vendor ID to %#x\n", val);
  549. break;
  550. case AC97_Extended_Audio_ID:
  551. dolog ("Attempt to write extended audio ID to %#x\n", val);
  552. break;
  553. case AC97_Extended_Audio_Ctrl_Stat:
  554. if (!(val & EACS_VRA)) {
  555. mixer_store (s, AC97_PCM_Front_DAC_Rate, 0xbb80);
  556. mixer_store (s, AC97_PCM_LR_ADC_Rate, 0xbb80);
  557. open_voice (s, PI_INDEX, 48000);
  558. open_voice (s, PO_INDEX, 48000);
  559. }
  560. if (!(val & EACS_VRM)) {
  561. mixer_store (s, AC97_MIC_ADC_Rate, 0xbb80);
  562. open_voice (s, MC_INDEX, 48000);
  563. }
  564. dolog ("Setting extended audio control to %#x\n", val);
  565. mixer_store (s, AC97_Extended_Audio_Ctrl_Stat, val);
  566. break;
  567. case AC97_PCM_Front_DAC_Rate:
  568. if (mixer_load (s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRA) {
  569. mixer_store (s, index, val);
  570. dolog ("Set front DAC rate to %d\n", val);
  571. open_voice (s, PO_INDEX, val);
  572. }
  573. else {
  574. dolog ("Attempt to set front DAC rate to %d, "
  575. "but VRA is not set\n",
  576. val);
  577. }
  578. break;
  579. case AC97_MIC_ADC_Rate:
  580. if (mixer_load (s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRM) {
  581. mixer_store (s, index, val);
  582. dolog ("Set MIC ADC rate to %d\n", val);
  583. open_voice (s, MC_INDEX, val);
  584. }
  585. else {
  586. dolog ("Attempt to set MIC ADC rate to %d, "
  587. "but VRM is not set\n",
  588. val);
  589. }
  590. break;
  591. case AC97_PCM_LR_ADC_Rate:
  592. if (mixer_load (s, AC97_Extended_Audio_Ctrl_Stat) & EACS_VRA) {
  593. mixer_store (s, index, val);
  594. dolog ("Set front LR ADC rate to %d\n", val);
  595. open_voice (s, PI_INDEX, val);
  596. }
  597. else {
  598. dolog ("Attempt to set LR ADC rate to %d, but VRA is not set\n",
  599. val);
  600. }
  601. break;
  602. case AC97_Headphone_Volume_Mute:
  603. case AC97_Master_Volume_Mono_Mute:
  604. case AC97_Master_Tone_RL:
  605. case AC97_PC_BEEP_Volume_Mute:
  606. case AC97_Phone_Volume_Mute:
  607. case AC97_Mic_Volume_Mute:
  608. case AC97_Line_In_Volume_Mute:
  609. case AC97_CD_Volume_Mute:
  610. case AC97_Video_Volume_Mute:
  611. case AC97_Aux_Volume_Mute:
  612. case AC97_Record_Gain_Mic_Mute:
  613. case AC97_General_Purpose:
  614. case AC97_3D_Control:
  615. case AC97_Sigmatel_Analog:
  616. case AC97_Sigmatel_Dac2Invert:
  617. /* None of the features in these regs are emulated, so they are RO */
  618. break;
  619. default:
  620. dolog ("U nam writew %#x <- %#x\n", addr, val);
  621. mixer_store (s, index, val);
  622. break;
  623. }
  624. }
  625. static void nam_writel (void *opaque, uint32_t addr, uint32_t val)
  626. {
  627. AC97LinkState *s = opaque;
  628. dolog ("U nam writel %#x <- %#x\n", addr, val);
  629. s->cas = 0;
  630. }
  631. /**
  632. * Native audio bus master
  633. * I/O Reads
  634. */
  635. static uint32_t nabm_readb (void *opaque, uint32_t addr)
  636. {
  637. AC97LinkState *s = opaque;
  638. AC97BusMasterRegs *r = NULL;
  639. uint32_t index = addr;
  640. uint32_t val = ~0U;
  641. switch (index) {
  642. case CAS:
  643. dolog ("CAS %d\n", s->cas);
  644. val = s->cas;
  645. s->cas = 1;
  646. break;
  647. case PI_CIV:
  648. case PO_CIV:
  649. case MC_CIV:
  650. r = &s->bm_regs[GET_BM (index)];
  651. val = r->civ;
  652. dolog ("CIV[%d] -> %#x\n", GET_BM (index), val);
  653. break;
  654. case PI_LVI:
  655. case PO_LVI:
  656. case MC_LVI:
  657. r = &s->bm_regs[GET_BM (index)];
  658. val = r->lvi;
  659. dolog ("LVI[%d] -> %#x\n", GET_BM (index), val);
  660. break;
  661. case PI_PIV:
  662. case PO_PIV:
  663. case MC_PIV:
  664. r = &s->bm_regs[GET_BM (index)];
  665. val = r->piv;
  666. dolog ("PIV[%d] -> %#x\n", GET_BM (index), val);
  667. break;
  668. case PI_CR:
  669. case PO_CR:
  670. case MC_CR:
  671. r = &s->bm_regs[GET_BM (index)];
  672. val = r->cr;
  673. dolog ("CR[%d] -> %#x\n", GET_BM (index), val);
  674. break;
  675. case PI_SR:
  676. case PO_SR:
  677. case MC_SR:
  678. r = &s->bm_regs[GET_BM (index)];
  679. val = r->sr & 0xff;
  680. dolog ("SRb[%d] -> %#x\n", GET_BM (index), val);
  681. break;
  682. default:
  683. dolog ("U nabm readb %#x -> %#x\n", addr, val);
  684. break;
  685. }
  686. return val;
  687. }
  688. static uint32_t nabm_readw (void *opaque, uint32_t addr)
  689. {
  690. AC97LinkState *s = opaque;
  691. AC97BusMasterRegs *r = NULL;
  692. uint32_t index = addr;
  693. uint32_t val = ~0U;
  694. switch (index) {
  695. case PI_SR:
  696. case PO_SR:
  697. case MC_SR:
  698. r = &s->bm_regs[GET_BM (index)];
  699. val = r->sr;
  700. dolog ("SR[%d] -> %#x\n", GET_BM (index), val);
  701. break;
  702. case PI_PICB:
  703. case PO_PICB:
  704. case MC_PICB:
  705. r = &s->bm_regs[GET_BM (index)];
  706. val = r->picb;
  707. dolog ("PICB[%d] -> %#x\n", GET_BM (index), val);
  708. break;
  709. default:
  710. dolog ("U nabm readw %#x -> %#x\n", addr, val);
  711. break;
  712. }
  713. return val;
  714. }
  715. static uint32_t nabm_readl (void *opaque, uint32_t addr)
  716. {
  717. AC97LinkState *s = opaque;
  718. AC97BusMasterRegs *r = NULL;
  719. uint32_t index = addr;
  720. uint32_t val = ~0U;
  721. switch (index) {
  722. case PI_BDBAR:
  723. case PO_BDBAR:
  724. case MC_BDBAR:
  725. r = &s->bm_regs[GET_BM (index)];
  726. val = r->bdbar;
  727. dolog ("BMADDR[%d] -> %#x\n", GET_BM (index), val);
  728. break;
  729. case PI_CIV:
  730. case PO_CIV:
  731. case MC_CIV:
  732. r = &s->bm_regs[GET_BM (index)];
  733. val = r->civ | (r->lvi << 8) | (r->sr << 16);
  734. dolog ("CIV LVI SR[%d] -> %#x, %#x, %#x\n", GET_BM (index),
  735. r->civ, r->lvi, r->sr);
  736. break;
  737. case PI_PICB:
  738. case PO_PICB:
  739. case MC_PICB:
  740. r = &s->bm_regs[GET_BM (index)];
  741. val = r->picb | (r->piv << 16) | (r->cr << 24);
  742. dolog ("PICB PIV CR[%d] -> %#x %#x %#x %#x\n", GET_BM (index),
  743. val, r->picb, r->piv, r->cr);
  744. break;
  745. case GLOB_CNT:
  746. val = s->glob_cnt;
  747. dolog ("glob_cnt -> %#x\n", val);
  748. break;
  749. case GLOB_STA:
  750. val = s->glob_sta | GS_S0CR;
  751. dolog ("glob_sta -> %#x\n", val);
  752. break;
  753. default:
  754. dolog ("U nabm readl %#x -> %#x\n", addr, val);
  755. break;
  756. }
  757. return val;
  758. }
  759. /**
  760. * Native audio bus master
  761. * I/O Writes
  762. */
  763. static void nabm_writeb (void *opaque, uint32_t addr, uint32_t val)
  764. {
  765. AC97LinkState *s = opaque;
  766. AC97BusMasterRegs *r = NULL;
  767. uint32_t index = addr;
  768. switch (index) {
  769. case PI_LVI:
  770. case PO_LVI:
  771. case MC_LVI:
  772. r = &s->bm_regs[GET_BM (index)];
  773. if ((r->cr & CR_RPBM) && (r->sr & SR_DCH)) {
  774. r->sr &= ~(SR_DCH | SR_CELV);
  775. r->civ = r->piv;
  776. r->piv = (r->piv + 1) % 32;
  777. fetch_bd (s, r);
  778. }
  779. r->lvi = val % 32;
  780. dolog ("LVI[%d] <- %#x\n", GET_BM (index), val);
  781. break;
  782. case PI_CR:
  783. case PO_CR:
  784. case MC_CR:
  785. r = &s->bm_regs[GET_BM (index)];
  786. if (val & CR_RR) {
  787. reset_bm_regs (s, r);
  788. }
  789. else {
  790. r->cr = val & CR_VALID_MASK;
  791. if (!(r->cr & CR_RPBM)) {
  792. voice_set_active (s, r - s->bm_regs, 0);
  793. r->sr |= SR_DCH;
  794. }
  795. else {
  796. r->civ = r->piv;
  797. r->piv = (r->piv + 1) % 32;
  798. fetch_bd (s, r);
  799. r->sr &= ~SR_DCH;
  800. voice_set_active (s, r - s->bm_regs, 1);
  801. }
  802. }
  803. dolog ("CR[%d] <- %#x (cr %#x)\n", GET_BM (index), val, r->cr);
  804. break;
  805. case PI_SR:
  806. case PO_SR:
  807. case MC_SR:
  808. r = &s->bm_regs[GET_BM (index)];
  809. r->sr |= val & ~(SR_RO_MASK | SR_WCLEAR_MASK);
  810. update_sr (s, r, r->sr & ~(val & SR_WCLEAR_MASK));
  811. dolog ("SR[%d] <- %#x (sr %#x)\n", GET_BM (index), val, r->sr);
  812. break;
  813. default:
  814. dolog ("U nabm writeb %#x <- %#x\n", addr, val);
  815. break;
  816. }
  817. }
  818. static void nabm_writew (void *opaque, uint32_t addr, uint32_t val)
  819. {
  820. AC97LinkState *s = opaque;
  821. AC97BusMasterRegs *r = NULL;
  822. uint32_t index = addr;
  823. switch (index) {
  824. case PI_SR:
  825. case PO_SR:
  826. case MC_SR:
  827. r = &s->bm_regs[GET_BM (index)];
  828. r->sr |= val & ~(SR_RO_MASK | SR_WCLEAR_MASK);
  829. update_sr (s, r, r->sr & ~(val & SR_WCLEAR_MASK));
  830. dolog ("SR[%d] <- %#x (sr %#x)\n", GET_BM (index), val, r->sr);
  831. break;
  832. default:
  833. dolog ("U nabm writew %#x <- %#x\n", addr, val);
  834. break;
  835. }
  836. }
  837. static void nabm_writel (void *opaque, uint32_t addr, uint32_t val)
  838. {
  839. AC97LinkState *s = opaque;
  840. AC97BusMasterRegs *r = NULL;
  841. uint32_t index = addr;
  842. switch (index) {
  843. case PI_BDBAR:
  844. case PO_BDBAR:
  845. case MC_BDBAR:
  846. r = &s->bm_regs[GET_BM (index)];
  847. r->bdbar = val & ~3;
  848. dolog ("BDBAR[%d] <- %#x (bdbar %#x)\n",
  849. GET_BM (index), val, r->bdbar);
  850. break;
  851. case GLOB_CNT:
  852. if (val & GC_WR)
  853. warm_reset (s);
  854. if (val & GC_CR)
  855. cold_reset (s);
  856. if (!(val & (GC_WR | GC_CR)))
  857. s->glob_cnt = val & GC_VALID_MASK;
  858. dolog ("glob_cnt <- %#x (glob_cnt %#x)\n", val, s->glob_cnt);
  859. break;
  860. case GLOB_STA:
  861. s->glob_sta &= ~(val & GS_WCLEAR_MASK);
  862. s->glob_sta |= (val & ~(GS_WCLEAR_MASK | GS_RO_MASK)) & GS_VALID_MASK;
  863. dolog ("glob_sta <- %#x (glob_sta %#x)\n", val, s->glob_sta);
  864. break;
  865. default:
  866. dolog ("U nabm writel %#x <- %#x\n", addr, val);
  867. break;
  868. }
  869. }
  870. static int write_audio (AC97LinkState *s, AC97BusMasterRegs *r,
  871. int max, int *stop)
  872. {
  873. uint8_t tmpbuf[4096];
  874. uint32_t addr = r->bd.addr;
  875. uint32_t temp = r->picb << 1;
  876. uint32_t written = 0;
  877. int to_copy = 0;
  878. temp = MIN (temp, max);
  879. if (!temp) {
  880. *stop = 1;
  881. return 0;
  882. }
  883. while (temp) {
  884. int copied;
  885. to_copy = MIN (temp, sizeof (tmpbuf));
  886. pci_dma_read (&s->dev, addr, tmpbuf, to_copy);
  887. copied = AUD_write (s->voice_po, tmpbuf, to_copy);
  888. dolog ("write_audio max=%x to_copy=%x copied=%x\n",
  889. max, to_copy, copied);
  890. if (!copied) {
  891. *stop = 1;
  892. break;
  893. }
  894. temp -= copied;
  895. addr += copied;
  896. written += copied;
  897. }
  898. if (!temp) {
  899. if (to_copy < 4) {
  900. dolog ("whoops\n");
  901. s->last_samp = 0;
  902. }
  903. else {
  904. s->last_samp = *(uint32_t *) &tmpbuf[to_copy - 4];
  905. }
  906. }
  907. r->bd.addr = addr;
  908. return written;
  909. }
  910. static void write_bup (AC97LinkState *s, int elapsed)
  911. {
  912. dolog ("write_bup\n");
  913. if (!(s->bup_flag & BUP_SET)) {
  914. if (s->bup_flag & BUP_LAST) {
  915. int i;
  916. uint8_t *p = s->silence;
  917. for (i = 0; i < sizeof (s->silence) / 4; i++, p += 4) {
  918. *(uint32_t *) p = s->last_samp;
  919. }
  920. }
  921. else {
  922. memset (s->silence, 0, sizeof (s->silence));
  923. }
  924. s->bup_flag |= BUP_SET;
  925. }
  926. while (elapsed) {
  927. int temp = MIN (elapsed, sizeof (s->silence));
  928. while (temp) {
  929. int copied = AUD_write (s->voice_po, s->silence, temp);
  930. if (!copied)
  931. return;
  932. temp -= copied;
  933. elapsed -= copied;
  934. }
  935. }
  936. }
  937. static int read_audio (AC97LinkState *s, AC97BusMasterRegs *r,
  938. int max, int *stop)
  939. {
  940. uint8_t tmpbuf[4096];
  941. uint32_t addr = r->bd.addr;
  942. uint32_t temp = r->picb << 1;
  943. uint32_t nread = 0;
  944. int to_copy = 0;
  945. SWVoiceIn *voice = (r - s->bm_regs) == MC_INDEX ? s->voice_mc : s->voice_pi;
  946. temp = MIN (temp, max);
  947. if (!temp) {
  948. *stop = 1;
  949. return 0;
  950. }
  951. while (temp) {
  952. int acquired;
  953. to_copy = MIN (temp, sizeof (tmpbuf));
  954. acquired = AUD_read (voice, tmpbuf, to_copy);
  955. if (!acquired) {
  956. *stop = 1;
  957. break;
  958. }
  959. pci_dma_write (&s->dev, addr, tmpbuf, acquired);
  960. temp -= acquired;
  961. addr += acquired;
  962. nread += acquired;
  963. }
  964. r->bd.addr = addr;
  965. return nread;
  966. }
  967. static void transfer_audio (AC97LinkState *s, int index, int elapsed)
  968. {
  969. AC97BusMasterRegs *r = &s->bm_regs[index];
  970. int stop = 0;
  971. if (s->invalid_freq[index]) {
  972. AUD_log ("ac97", "attempt to use voice %d with invalid frequency %d\n",
  973. index, s->invalid_freq[index]);
  974. return;
  975. }
  976. if (r->sr & SR_DCH) {
  977. if (r->cr & CR_RPBM) {
  978. switch (index) {
  979. case PO_INDEX:
  980. write_bup (s, elapsed);
  981. break;
  982. }
  983. }
  984. return;
  985. }
  986. while ((elapsed >> 1) && !stop) {
  987. int temp;
  988. if (!r->bd_valid) {
  989. dolog ("invalid bd\n");
  990. fetch_bd (s, r);
  991. }
  992. if (!r->picb) {
  993. dolog ("fresh bd %d is empty %#x %#x\n",
  994. r->civ, r->bd.addr, r->bd.ctl_len);
  995. if (r->civ == r->lvi) {
  996. r->sr |= SR_DCH; /* CELV? */
  997. s->bup_flag = 0;
  998. break;
  999. }
  1000. r->sr &= ~SR_CELV;
  1001. r->civ = r->piv;
  1002. r->piv = (r->piv + 1) % 32;
  1003. fetch_bd (s, r);
  1004. return;
  1005. }
  1006. switch (index) {
  1007. case PO_INDEX:
  1008. temp = write_audio (s, r, elapsed, &stop);
  1009. elapsed -= temp;
  1010. r->picb -= (temp >> 1);
  1011. break;
  1012. case PI_INDEX:
  1013. case MC_INDEX:
  1014. temp = read_audio (s, r, elapsed, &stop);
  1015. elapsed -= temp;
  1016. r->picb -= (temp >> 1);
  1017. break;
  1018. }
  1019. if (!r->picb) {
  1020. uint32_t new_sr = r->sr & ~SR_CELV;
  1021. if (r->bd.ctl_len & BD_IOC) {
  1022. new_sr |= SR_BCIS;
  1023. }
  1024. if (r->civ == r->lvi) {
  1025. dolog ("Underrun civ (%d) == lvi (%d)\n", r->civ, r->lvi);
  1026. new_sr |= SR_LVBCI | SR_DCH | SR_CELV;
  1027. stop = 1;
  1028. s->bup_flag = (r->bd.ctl_len & BD_BUP) ? BUP_LAST : 0;
  1029. }
  1030. else {
  1031. r->civ = r->piv;
  1032. r->piv = (r->piv + 1) % 32;
  1033. fetch_bd (s, r);
  1034. }
  1035. update_sr (s, r, new_sr);
  1036. }
  1037. }
  1038. }
  1039. static void pi_callback (void *opaque, int avail)
  1040. {
  1041. transfer_audio (opaque, PI_INDEX, avail);
  1042. }
  1043. static void mc_callback (void *opaque, int avail)
  1044. {
  1045. transfer_audio (opaque, MC_INDEX, avail);
  1046. }
  1047. static void po_callback (void *opaque, int free)
  1048. {
  1049. transfer_audio (opaque, PO_INDEX, free);
  1050. }
  1051. static const VMStateDescription vmstate_ac97_bm_regs = {
  1052. .name = "ac97_bm_regs",
  1053. .version_id = 1,
  1054. .minimum_version_id = 1,
  1055. .fields = (VMStateField[]) {
  1056. VMSTATE_UINT32 (bdbar, AC97BusMasterRegs),
  1057. VMSTATE_UINT8 (civ, AC97BusMasterRegs),
  1058. VMSTATE_UINT8 (lvi, AC97BusMasterRegs),
  1059. VMSTATE_UINT16 (sr, AC97BusMasterRegs),
  1060. VMSTATE_UINT16 (picb, AC97BusMasterRegs),
  1061. VMSTATE_UINT8 (piv, AC97BusMasterRegs),
  1062. VMSTATE_UINT8 (cr, AC97BusMasterRegs),
  1063. VMSTATE_UINT32 (bd_valid, AC97BusMasterRegs),
  1064. VMSTATE_UINT32 (bd.addr, AC97BusMasterRegs),
  1065. VMSTATE_UINT32 (bd.ctl_len, AC97BusMasterRegs),
  1066. VMSTATE_END_OF_LIST ()
  1067. }
  1068. };
  1069. static int ac97_post_load (void *opaque, int version_id)
  1070. {
  1071. uint8_t active[LAST_INDEX];
  1072. AC97LinkState *s = opaque;
  1073. record_select (s, mixer_load (s, AC97_Record_Select));
  1074. set_volume (s, AC97_Master_Volume_Mute,
  1075. mixer_load (s, AC97_Master_Volume_Mute));
  1076. set_volume (s, AC97_PCM_Out_Volume_Mute,
  1077. mixer_load (s, AC97_PCM_Out_Volume_Mute));
  1078. set_volume (s, AC97_Record_Gain_Mute,
  1079. mixer_load (s, AC97_Record_Gain_Mute));
  1080. active[PI_INDEX] = !!(s->bm_regs[PI_INDEX].cr & CR_RPBM);
  1081. active[PO_INDEX] = !!(s->bm_regs[PO_INDEX].cr & CR_RPBM);
  1082. active[MC_INDEX] = !!(s->bm_regs[MC_INDEX].cr & CR_RPBM);
  1083. reset_voices (s, active);
  1084. s->bup_flag = 0;
  1085. s->last_samp = 0;
  1086. return 0;
  1087. }
  1088. static bool is_version_2 (void *opaque, int version_id)
  1089. {
  1090. return version_id == 2;
  1091. }
  1092. static const VMStateDescription vmstate_ac97 = {
  1093. .name = "ac97",
  1094. .version_id = 3,
  1095. .minimum_version_id = 2,
  1096. .post_load = ac97_post_load,
  1097. .fields = (VMStateField[]) {
  1098. VMSTATE_PCI_DEVICE (dev, AC97LinkState),
  1099. VMSTATE_UINT32 (glob_cnt, AC97LinkState),
  1100. VMSTATE_UINT32 (glob_sta, AC97LinkState),
  1101. VMSTATE_UINT32 (cas, AC97LinkState),
  1102. VMSTATE_STRUCT_ARRAY (bm_regs, AC97LinkState, 3, 1,
  1103. vmstate_ac97_bm_regs, AC97BusMasterRegs),
  1104. VMSTATE_BUFFER (mixer_data, AC97LinkState),
  1105. VMSTATE_UNUSED_TEST (is_version_2, 3),
  1106. VMSTATE_END_OF_LIST ()
  1107. }
  1108. };
  1109. static uint64_t nam_read(void *opaque, hwaddr addr, unsigned size)
  1110. {
  1111. if ((addr / size) > 256) {
  1112. return -1;
  1113. }
  1114. switch (size) {
  1115. case 1:
  1116. return nam_readb(opaque, addr);
  1117. case 2:
  1118. return nam_readw(opaque, addr);
  1119. case 4:
  1120. return nam_readl(opaque, addr);
  1121. default:
  1122. return -1;
  1123. }
  1124. }
  1125. static void nam_write(void *opaque, hwaddr addr, uint64_t val,
  1126. unsigned size)
  1127. {
  1128. if ((addr / size) > 256) {
  1129. return;
  1130. }
  1131. switch (size) {
  1132. case 1:
  1133. nam_writeb(opaque, addr, val);
  1134. break;
  1135. case 2:
  1136. nam_writew(opaque, addr, val);
  1137. break;
  1138. case 4:
  1139. nam_writel(opaque, addr, val);
  1140. break;
  1141. }
  1142. }
  1143. static const MemoryRegionOps ac97_io_nam_ops = {
  1144. .read = nam_read,
  1145. .write = nam_write,
  1146. .impl = {
  1147. .min_access_size = 1,
  1148. .max_access_size = 4,
  1149. },
  1150. .endianness = DEVICE_LITTLE_ENDIAN,
  1151. };
  1152. static uint64_t nabm_read(void *opaque, hwaddr addr, unsigned size)
  1153. {
  1154. if ((addr / size) > 64) {
  1155. return -1;
  1156. }
  1157. switch (size) {
  1158. case 1:
  1159. return nabm_readb(opaque, addr);
  1160. case 2:
  1161. return nabm_readw(opaque, addr);
  1162. case 4:
  1163. return nabm_readl(opaque, addr);
  1164. default:
  1165. return -1;
  1166. }
  1167. }
  1168. static void nabm_write(void *opaque, hwaddr addr, uint64_t val,
  1169. unsigned size)
  1170. {
  1171. if ((addr / size) > 64) {
  1172. return;
  1173. }
  1174. switch (size) {
  1175. case 1:
  1176. nabm_writeb(opaque, addr, val);
  1177. break;
  1178. case 2:
  1179. nabm_writew(opaque, addr, val);
  1180. break;
  1181. case 4:
  1182. nabm_writel(opaque, addr, val);
  1183. break;
  1184. }
  1185. }
  1186. static const MemoryRegionOps ac97_io_nabm_ops = {
  1187. .read = nabm_read,
  1188. .write = nabm_write,
  1189. .impl = {
  1190. .min_access_size = 1,
  1191. .max_access_size = 4,
  1192. },
  1193. .endianness = DEVICE_LITTLE_ENDIAN,
  1194. };
  1195. static void ac97_on_reset (DeviceState *dev)
  1196. {
  1197. AC97LinkState *s = container_of(dev, AC97LinkState, dev.qdev);
  1198. reset_bm_regs (s, &s->bm_regs[0]);
  1199. reset_bm_regs (s, &s->bm_regs[1]);
  1200. reset_bm_regs (s, &s->bm_regs[2]);
  1201. /*
  1202. * Reset the mixer too. The Windows XP driver seems to rely on
  1203. * this. At least it wants to read the vendor id before it resets
  1204. * the codec manually.
  1205. */
  1206. mixer_reset (s);
  1207. }
  1208. static void ac97_realize(PCIDevice *dev, Error **errp)
  1209. {
  1210. AC97LinkState *s = AC97(dev);
  1211. uint8_t *c = s->dev.config;
  1212. /* TODO: no need to override */
  1213. c[PCI_COMMAND] = 0x00; /* pcicmd pci command rw, ro */
  1214. c[PCI_COMMAND + 1] = 0x00;
  1215. /* TODO: */
  1216. c[PCI_STATUS] = PCI_STATUS_FAST_BACK; /* pcists pci status rwc, ro */
  1217. c[PCI_STATUS + 1] = PCI_STATUS_DEVSEL_MEDIUM >> 8;
  1218. c[PCI_CLASS_PROG] = 0x00; /* pi programming interface ro */
  1219. /* TODO set when bar is registered. no need to override. */
  1220. /* nabmar native audio mixer base address rw */
  1221. c[PCI_BASE_ADDRESS_0] = PCI_BASE_ADDRESS_SPACE_IO;
  1222. c[PCI_BASE_ADDRESS_0 + 1] = 0x00;
  1223. c[PCI_BASE_ADDRESS_0 + 2] = 0x00;
  1224. c[PCI_BASE_ADDRESS_0 + 3] = 0x00;
  1225. /* TODO set when bar is registered. no need to override. */
  1226. /* nabmbar native audio bus mastering base address rw */
  1227. c[PCI_BASE_ADDRESS_0 + 4] = PCI_BASE_ADDRESS_SPACE_IO;
  1228. c[PCI_BASE_ADDRESS_0 + 5] = 0x00;
  1229. c[PCI_BASE_ADDRESS_0 + 6] = 0x00;
  1230. c[PCI_BASE_ADDRESS_0 + 7] = 0x00;
  1231. c[PCI_INTERRUPT_LINE] = 0x00; /* intr_ln interrupt line rw */
  1232. c[PCI_INTERRUPT_PIN] = 0x01; /* intr_pn interrupt pin ro */
  1233. memory_region_init_io (&s->io_nam, OBJECT(s), &ac97_io_nam_ops, s,
  1234. "ac97-nam", 1024);
  1235. memory_region_init_io (&s->io_nabm, OBJECT(s), &ac97_io_nabm_ops, s,
  1236. "ac97-nabm", 256);
  1237. pci_register_bar (&s->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io_nam);
  1238. pci_register_bar (&s->dev, 1, PCI_BASE_ADDRESS_SPACE_IO, &s->io_nabm);
  1239. AUD_register_card ("ac97", &s->card);
  1240. ac97_on_reset(DEVICE(s));
  1241. }
  1242. static void ac97_exit(PCIDevice *dev)
  1243. {
  1244. AC97LinkState *s = AC97(dev);
  1245. AUD_close_in(&s->card, s->voice_pi);
  1246. AUD_close_out(&s->card, s->voice_po);
  1247. AUD_close_in(&s->card, s->voice_mc);
  1248. AUD_remove_card(&s->card);
  1249. }
  1250. static Property ac97_properties[] = {
  1251. DEFINE_AUDIO_PROPERTIES(AC97LinkState, card),
  1252. DEFINE_PROP_END_OF_LIST (),
  1253. };
  1254. static void ac97_class_init (ObjectClass *klass, void *data)
  1255. {
  1256. DeviceClass *dc = DEVICE_CLASS (klass);
  1257. PCIDeviceClass *k = PCI_DEVICE_CLASS (klass);
  1258. k->realize = ac97_realize;
  1259. k->exit = ac97_exit;
  1260. k->vendor_id = PCI_VENDOR_ID_INTEL;
  1261. k->device_id = PCI_DEVICE_ID_INTEL_82801AA_5;
  1262. k->revision = 0x01;
  1263. k->class_id = PCI_CLASS_MULTIMEDIA_AUDIO;
  1264. set_bit(DEVICE_CATEGORY_SOUND, dc->categories);
  1265. dc->desc = "Intel 82801AA AC97 Audio";
  1266. dc->vmsd = &vmstate_ac97;
  1267. device_class_set_props(dc, ac97_properties);
  1268. dc->reset = ac97_on_reset;
  1269. }
  1270. static const TypeInfo ac97_info = {
  1271. .name = TYPE_AC97,
  1272. .parent = TYPE_PCI_DEVICE,
  1273. .instance_size = sizeof (AC97LinkState),
  1274. .class_init = ac97_class_init,
  1275. .interfaces = (InterfaceInfo[]) {
  1276. { INTERFACE_CONVENTIONAL_PCI_DEVICE },
  1277. { },
  1278. },
  1279. };
  1280. static void ac97_register_types (void)
  1281. {
  1282. type_register_static (&ac97_info);
  1283. deprecated_register_soundhw("ac97", "Intel 82801AA AC97 Audio",
  1284. 0, TYPE_AC97);
  1285. }
  1286. type_init (ac97_register_types)