Changeset 34061 in vbox
- Timestamp:
- Nov 15, 2010 6:02:31 AM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 67743
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp
r33881 r34061 310 310 #define ICH6_HDA_REG_SD7FIFOS (HDA_STREAM_REG_DEF(FIFOS, 0) + 70) /* 0x170 */ 311 311 312 /* 313 * ICH6 datasheet defines limits for FIFOS registers (18.2.39) 314 * formula: size - 1 315 * Other values not listed are not supported. 316 */ 317 #define HDA_SDONFIFO_16B (0xF) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 318 #define HDA_SDONFIFO_32B (0x1F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 319 #define HDA_SDONFIFO_64B (0x3F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 320 #define HDA_SDONFIFO_128B (0x7F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 321 #define HDA_SDONFIFO_192B (0xBF) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */ 322 #define HDA_SDONFIFO_256B (0xFF) /* 20-, 24-bit Output Streams */ 323 #define HDA_SDINFIFO_120B (0x77) /* 8-, 16-, 20-, 24-, 32-bit Input Streams */ 324 #define HDA_SDINFIFO_160B (0x9F) /* 20-, 24-bit Input Streams Streams */ 312 325 #define SDFIFOS(pState, num) HDA_REG((pState), SD(FIFOS, num)) 313 326 … … 439 452 DECLCALLBACK(int)hdaRegWriteSDSTS(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value); 440 453 DECLCALLBACK(int)hdaRegWriteSDLVI(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value); 454 DECLCALLBACK(int)hdaRegWriteSDFIFOS(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value); 441 455 DECLCALLBACK(int)hdaRegWriteSDBDPL(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value); 442 456 DECLCALLBACK(int)hdaRegWriteSDBDPU(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value); … … 517 531 { 0x0008C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "ISD0LVI" , "ISD0 Last Valid Index" }, 518 532 { 0x0008E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "ISD0FIFOW", "ISD0 FIFO Watermark" }, 519 { 0x00090, 0x00002, 0x000000FF, 0x000000 FF, hdaRegReadU16 , hdaRegWriteU16 , "ISD0FIFOS", "ISD0 FIFO Size" },533 { 0x00090, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16 , hdaRegWriteU16 , "ISD0FIFOS", "ISD0 FIFO Size" }, 520 534 { 0x00092, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "ISD0FMT" , "ISD0 Format" }, 521 535 { 0x00098, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "ISD0BDPL" , "ISD0 Buffer Descriptor List Pointer-Lower Base Address" }, … … 528 542 { 0x000AC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "ISD1LVI" , "ISD1 Last Valid Index" }, 529 543 { 0x000AE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "ISD1FIFOW", "ISD1 FIFO Watermark" }, 530 { 0x000B0, 0x00002, 0x000000FF, 0x000000 FF, hdaRegReadU16 , hdaRegWriteU16 , "ISD1FIFOS", "ISD1 FIFO Size" },544 { 0x000B0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16 , hdaRegWriteU16 , "ISD1FIFOS", "ISD1 FIFO Size" }, 531 545 { 0x000B2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "ISD1FMT" , "ISD1 Format" }, 532 546 { 0x000B8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "ISD1BDPL" , "ISD1 Buffer Descriptor List Pointer-Lower Base Address" }, … … 539 553 { 0x000CC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "ISD2LVI" , "ISD2 Last Valid Index" }, 540 554 { 0x000CE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "ISD2FIFOW", "ISD2 FIFO Watermark" }, 541 { 0x000D0, 0x00002, 0x000000FF, 0x000000 FF, hdaRegReadU16 , hdaRegWriteU16 , "ISD2FIFOS", "ISD2 FIFO Size" },555 { 0x000D0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16 , hdaRegWriteU16 , "ISD2FIFOS", "ISD2 FIFO Size" }, 542 556 { 0x000D2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "ISD2FMT" , "ISD2 Format" }, 543 557 { 0x000D8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "ISD2BDPL" , "ISD2 Buffer Descriptor List Pointer-Lower Base Address" }, … … 550 564 { 0x000EC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "ISD3LVI" , "ISD3 Last Valid Index" }, 551 565 { 0x000EE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "ISD3FIFOW", "ISD3 FIFO Watermark" }, 552 { 0x000F0, 0x00002, 0x000000FF, 0x000000 FF, hdaRegReadU16 , hdaRegWriteU16 , "ISD3FIFOS", "ISD3 FIFO Size" },566 { 0x000F0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16 , hdaRegWriteU16 , "ISD3FIFOS", "ISD3 FIFO Size" }, 553 567 { 0x000F2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "ISD3FMT" , "ISD3 Format" }, 554 568 { 0x000F8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "ISD3BDPL" , "ISD3 Buffer Descriptor List Pointer-Lower Base Address" }, … … 561 575 { 0x0010C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "OSD0LVI" , "OSD0 Last Valid Index" }, 562 576 { 0x0010E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "OSD0FIFOW", "OSD0 FIFO Watermark" }, 563 { 0x00110, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWrite U16, "OSD0FIFOS", "OSD0 FIFO Size" },577 { 0x00110, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWriteSDFIFOS , "OSD0FIFOS", "OSD0 FIFO Size" }, 564 578 { 0x00112, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "OSD0FMT" , "OSD0 Format" }, 565 579 { 0x00118, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "OSD0BDPL" , "OSD0 Buffer Descriptor List Pointer-Lower Base Address" }, … … 572 586 { 0x0012C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "OSD1LVI" , "OSD1 Last Valid Index" }, 573 587 { 0x0012E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "OSD1FIFOW", "OSD1 FIFO Watermark" }, 574 { 0x00130, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWrite U16, "OSD1FIFOS", "OSD1 FIFO Size" },588 { 0x00130, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWriteSDFIFOS , "OSD1FIFOS", "OSD1 FIFO Size" }, 575 589 { 0x00132, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "OSD1FMT" , "OSD1 Format" }, 576 590 { 0x00138, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "OSD1BDPL" , "OSD1 Buffer Descriptor List Pointer-Lower Base Address" }, … … 583 597 { 0x0014C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "OSD2LVI" , "OSD2 Last Valid Index" }, 584 598 { 0x0014E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "OSD2FIFOW", "OSD2 FIFO Watermark" }, 585 { 0x00150, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWrite U16, "OSD2FIFOS", "OSD2 FIFO Size" },599 { 0x00150, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWriteSDFIFOS , "OSD2FIFOS", "OSD2 FIFO Size" }, 586 600 { 0x00152, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "OSD2FMT" , "OSD2 Format" }, 587 601 { 0x00158, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "OSD2BDPL" , "OSD2 Buffer Descriptor List Pointer-Lower Base Address" }, … … 594 608 { 0x0016C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16 , hdaRegWriteSDLVI , "OSD3LVI" , "OSD3 Last Valid Index" }, 595 609 { 0x0016E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16 , hdaRegWriteU16 , "OSD3FIFOW", "OSD3 FIFO Watermark" }, 596 { 0x00170, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWrite U16, "OSD3FIFOS", "OSD3 FIFO Size" },610 { 0x00170, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16 , hdaRegWriteSDFIFOS , "OSD3FIFOS", "OSD3 FIFO Size" }, 597 611 { 0x00172, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16 , hdaRegWriteU16 , "OSD3FMT" , "OSD3 Format" }, 598 612 { 0x00178, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32 , hdaRegWriteSDBDPL , "OSD3BDPL" , "OSD3 Buffer Descriptor List Pointer-Lower Base Address" }, … … 1040 1054 AssertRCReturn(rc, VINF_SUCCESS); 1041 1055 return rc; 1056 } 1057 1058 /* 1059 * Note this method could be called for changing value on Output Streams only (ICH6 datacheet 18.2.39) 1060 * 1061 */ 1062 DECLCALLBACK(int)hdaRegWriteSDFIFOS(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value) 1063 { 1064 switch (index) 1065 { 1066 /* SDInFIFOS is RO, n=0-3 */ 1067 case ICH6_HDA_REG_SD0FIFOS: 1068 case ICH6_HDA_REG_SD1FIFOS: 1069 case ICH6_HDA_REG_SD2FIFOS: 1070 case ICH6_HDA_REG_SD3FIFOS: 1071 Log(("hda: Guest tries change value of FIFO size of Input Stream\n")); 1072 return VINF_SUCCESS; 1073 case ICH6_HDA_REG_SD4FIFOS: 1074 case ICH6_HDA_REG_SD5FIFOS: 1075 case ICH6_HDA_REG_SD6FIFOS: 1076 case ICH6_HDA_REG_SD7FIFOS: 1077 switch(u32Value) 1078 { 1079 case HDA_SDONFIFO_16B: 1080 case HDA_SDONFIFO_32B: 1081 case HDA_SDONFIFO_64B: 1082 case HDA_SDONFIFO_128B: 1083 case HDA_SDONFIFO_192B: 1084 return hdaRegWriteU16(pState, offset, index, u32Value); 1085 1086 case HDA_SDONFIFO_256B: 1087 Log(("hda: 256 bit is unsupported, HDA is switched into 192B mode\n")); 1088 default: 1089 return hdaRegWriteU16(pState, offset, index, HDA_SDONFIFO_192B); 1090 } 1091 return VINF_SUCCESS; 1092 default: 1093 AssertMsgFailed(("Something wierd happens with register lookup routine")); 1094 } 1095 return VINF_SUCCESS; 1042 1096 } 1043 1097 … … 1212 1266 static uint32_t hdaReadAudio(INTELHDLinkState *pState, int avail, bool *fStop) 1213 1267 { 1214 uint8_t tmpbuf[ 512];1268 uint8_t tmpbuf[256]; 1215 1269 uint32_t temp; 1216 1270 uint32_t u32Rest = 0; … … 1230 1284 { 1231 1285 int copied; 1232 to_copy = audio_MIN(temp, SDFIFOS(pState, 4) & ~((1<<4) - 1));1286 to_copy = audio_MIN(temp, SDFIFOS(pState, 4) + 1); 1233 1287 copied = AUD_read (voice, tmpbuf, to_copy); 1234 1288 Log (("hda: read_audio max=%x to_copy=%x copied=%x\n", … … 1248 1302 static uint32_t hdaWriteAudio(INTELHDLinkState *pState, int avail, bool *fStop) 1249 1303 { 1250 uint8_t tmpbuf[ 512];1304 uint8_t tmpbuf[256]; 1251 1305 uint32_t temp; 1252 1306 uint32_t u32Rest; … … 1261 1315 return written; 1262 1316 } 1263 temp = audio_MIN(SDFIFOS(pState, 4) & ~((1<<4) - 1), temp);1317 temp = audio_MIN(SDFIFOS(pState, 4) + 1, temp); 1264 1318 while (temp) 1265 1319 { … … 1268 1322 PDMDevHlpPhysRead(ICH6_HDASTATE_2_DEVINS(pState), pBdle->u64BdleCviAddr + pBdle->u32BdleCviPos, tmpbuf, to_copy); 1269 1323 copied = AUD_write (OSD0FMT_TO_AUDIO_SELECTOR(pState), tmpbuf, to_copy); 1270 Log 1271 1324 Log(("hda: write_audio max=%x to_copy=%x copied=%x\n", 1325 avail, to_copy, copied)); 1272 1326 if (!copied) 1273 1327 { … … 1630 1684 1631 1685 /* ICH6 defines default values (0x77 for input and 0xBF for output descriptors) of FIFO size. 18.2.39 */ 1632 SDFIFOS(&pThis->hda, 0) = 0x77;1633 SDFIFOS(&pThis->hda, 1) = 0x77;1634 SDFIFOS(&pThis->hda, 2) = 0x77;1635 SDFIFOS(&pThis->hda, 3) = 0x77;1636 SDFIFOS(&pThis->hda, 4) = 0xBF;1637 SDFIFOS(&pThis->hda, 5) = 0xBF;1638 SDFIFOS(&pThis->hda, 6) = 0xBF;1639 SDFIFOS(&pThis->hda, 7) = 0xBF;1686 SDFIFOS(&pThis->hda, 0) = HDA_SDINFIFO_120B; 1687 SDFIFOS(&pThis->hda, 1) = HDA_SDINFIFO_120B; 1688 SDFIFOS(&pThis->hda, 2) = HDA_SDINFIFO_120B; 1689 SDFIFOS(&pThis->hda, 3) = HDA_SDINFIFO_120B; 1690 SDFIFOS(&pThis->hda, 4) = HDA_SDONFIFO_192B; 1691 SDFIFOS(&pThis->hda, 5) = HDA_SDONFIFO_192B; 1692 SDFIFOS(&pThis->hda, 6) = HDA_SDONFIFO_192B; 1693 SDFIFOS(&pThis->hda, 7) = HDA_SDONFIFO_192B; 1640 1694 1641 1695 /* emulateion of codec "wake up" HDA spec (5.5.1 and 6.5)*/
Note:
See TracChangeset
for help on using the changeset viewer.