- Timestamp:
- Jul 9, 2021 12:30:26 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 145621
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Audio/DevHdaCodec.cpp
r89887 r90119 145 145 146 146 147 148 #if 0 /* unused */ 149 static DECLCALLBACK(void) stac9220DbgNodes(PHDACODEC pThis, PCDBGFINFOHLP pHlp, const char *pszArgs) 150 { 151 RT_NOREF(pszArgs); 152 uint8_t const cTotalNodes = RT_MIN(pThis->cTotalNodes, RT_ELEMENTS(pThis->aNodes)); 153 for (uint8_t i = 1; i < cTotalNodes; i++) 154 { 155 PCODECNODE pNode = &pThis->aNodes[i]; 156 AMPLIFIER *pAmp = &pNode->dac.B_params; 157 158 uint8_t lVol = AMPLIFIER_REGISTER(*pAmp, AMPLIFIER_OUT, AMPLIFIER_LEFT, 0) & 0x7f; 159 uint8_t rVol = AMPLIFIER_REGISTER(*pAmp, AMPLIFIER_OUT, AMPLIFIER_RIGHT, 0) & 0x7f; 160 161 pHlp->pfnPrintf(pHlp, "0x%x: lVol=%RU8, rVol=%RU8\n", i, lVol, rVol); 162 } 163 } 164 #endif 165 147 /********************************************************************************************************************************* 148 * STAC9220 Constructor / Reset * 149 *********************************************************************************************************************************/ 166 150 167 151 /** … … 741 725 } 742 726 727 743 728 /** 744 729 * Resets the codec with all its connected nodes. … … 824 809 #endif /* IN_RING3 */ 825 810 811 812 /********************************************************************************************************************************* 813 * Common Helpers * 814 *********************************************************************************************************************************/ 815 826 816 /* 827 817 * Some generic predicate functions. 828 818 */ 829 830 #define DECLISNODEOFTYPE(type) \ 831 DECLINLINE(bool) hdaCodecIs##type##Node(PHDACODEC pThis, uint8_t cNode) \ 832 { \ 833 Assert(pThis->au8##type##s); \ 834 for (int i = 0; pThis->au8##type##s[i] != 0; ++i) \ 835 if (pThis->au8##type##s[i] == cNode) \ 836 return true; \ 837 return false; \ 819 #define HDA_CODEC_IS_NODE_OF_TYPE_FUNC(a_Type) \ 820 DECLINLINE(bool) hdaCodecIs##a_Type##Node(PHDACODEC pThis, uint8_t idNode) \ 821 { \ 822 Assert(pThis->au8##a_Type##s); \ 823 for (uintptr_t i = 0; i < RT_ELEMENTS(pThis->au8##a_Type##s) && pThis->au8##a_Type##s[i] != 0; i++) \ 824 if (pThis->au8##a_Type##s[i] == idNode) \ 825 return true; \ 826 return false; \ 838 827 } 839 828 /* hdaCodecIsPortNode */ 840 DECLISNODEOFTYPE(Port)829 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(Port) 841 830 /* hdaCodecIsDacNode */ 842 DECLISNODEOFTYPE(Dac)831 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(Dac) 843 832 /* hdaCodecIsAdcVolNode */ 844 DECLISNODEOFTYPE(AdcVol)833 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(AdcVol) 845 834 /* hdaCodecIsAdcNode */ 846 DECLISNODEOFTYPE(Adc)835 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(Adc) 847 836 /* hdaCodecIsAdcMuxNode */ 848 DECLISNODEOFTYPE(AdcMux)837 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(AdcMux) 849 838 /* hdaCodecIsPcbeepNode */ 850 DECLISNODEOFTYPE(Pcbeep)839 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(Pcbeep) 851 840 /* hdaCodecIsSpdifOutNode */ 852 DECLISNODEOFTYPE(SpdifOut)841 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(SpdifOut) 853 842 /* hdaCodecIsSpdifInNode */ 854 DECLISNODEOFTYPE(SpdifIn)843 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(SpdifIn) 855 844 /* hdaCodecIsDigInPinNode */ 856 DECLISNODEOFTYPE(DigInPin)845 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(DigInPin) 857 846 /* hdaCodecIsDigOutPinNode */ 858 DECLISNODEOFTYPE(DigOutPin)847 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(DigOutPin) 859 848 /* hdaCodecIsCdNode */ 860 DECLISNODEOFTYPE(Cd)849 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(Cd) 861 850 /* hdaCodecIsVolKnobNode */ 862 DECLISNODEOFTYPE(VolKnob)851 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(VolKnob) 863 852 /* hdaCodecIsReservedNode */ 864 DECLISNODEOFTYPE(Reserved)853 HDA_CODEC_IS_NODE_OF_TYPE_FUNC(Reserved) 865 854 866 855 #ifdef IN_RING3 … … 937 926 938 927 939 /* 940 * Verb processor functions. 941 928 /********************************************************************************************************************************* 929 * Verb Processor Functions. * 930 *********************************************************************************************************************************/ 942 931 #if 0 /* unused */ 943 932 933 /** 934 * @interface_method_impl{CODECVERB, pfn, Unimplemented} 935 */ 944 936 static DECLCALLBACK(int) vrbProcUnimplemented(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 945 937 { … … 951 943 } 952 944 945 946 /** 947 * @interface_method_impl{CODECVERB, pfn, ???} 948 */ 953 949 static DECLCALLBACK(int) vrbProcBreak(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 954 950 { … … 961 957 #endif /* unused */ 962 958 963 964 /* B-- */ 959 /** 960 * @interface_method_impl{CODECVERB, pfn, b--} 961 */ 965 962 static DECLCALLBACK(int) vrbProcGetAmplifier(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 966 963 { … … 975 972 if (hdaCodecIsDacNode(pThis, CODEC_NID(cmd))) 976 973 *pResp = AMPLIFIER_REGISTER(pNode->dac.B_params, 977 CODEC_GET_AMP_DIRECTION(cmd),978 CODEC_GET_AMP_SIDE(cmd),979 u8Index);974 CODEC_GET_AMP_DIRECTION(cmd), 975 CODEC_GET_AMP_SIDE(cmd), 976 u8Index); 980 977 else if (hdaCodecIsAdcVolNode(pThis, CODEC_NID(cmd))) 981 978 *pResp = AMPLIFIER_REGISTER(pNode->adcvol.B_params, 982 CODEC_GET_AMP_DIRECTION(cmd),983 CODEC_GET_AMP_SIDE(cmd),984 u8Index);979 CODEC_GET_AMP_DIRECTION(cmd), 980 CODEC_GET_AMP_SIDE(cmd), 981 u8Index); 985 982 else if (hdaCodecIsAdcMuxNode(pThis, CODEC_NID(cmd))) 986 983 *pResp = AMPLIFIER_REGISTER(pNode->adcmux.B_params, 987 CODEC_GET_AMP_DIRECTION(cmd),988 CODEC_GET_AMP_SIDE(cmd),989 u8Index);984 CODEC_GET_AMP_DIRECTION(cmd), 985 CODEC_GET_AMP_SIDE(cmd), 986 u8Index); 990 987 else if (hdaCodecIsPcbeepNode(pThis, CODEC_NID(cmd))) 991 988 *pResp = AMPLIFIER_REGISTER(pNode->pcbeep.B_params, 992 CODEC_GET_AMP_DIRECTION(cmd),993 CODEC_GET_AMP_SIDE(cmd),994 u8Index);989 CODEC_GET_AMP_DIRECTION(cmd), 990 CODEC_GET_AMP_SIDE(cmd), 991 u8Index); 995 992 else if (hdaCodecIsPortNode(pThis, CODEC_NID(cmd))) 996 993 *pResp = AMPLIFIER_REGISTER(pNode->port.B_params, 997 CODEC_GET_AMP_DIRECTION(cmd),998 CODEC_GET_AMP_SIDE(cmd),999 u8Index);994 CODEC_GET_AMP_DIRECTION(cmd), 995 CODEC_GET_AMP_SIDE(cmd), 996 u8Index); 1000 997 else if (hdaCodecIsAdcNode(pThis, CODEC_NID(cmd))) 1001 998 *pResp = AMPLIFIER_REGISTER(pNode->adc.B_params, 1002 CODEC_GET_AMP_DIRECTION(cmd),1003 CODEC_GET_AMP_SIDE(cmd),1004 u8Index);999 CODEC_GET_AMP_DIRECTION(cmd), 1000 CODEC_GET_AMP_SIDE(cmd), 1001 u8Index); 1005 1002 else 1006 1003 LogRel2(("HDA: Warning: Unhandled get amplifier command: 0x%x (NID=0x%x [%RU8])\n", cmd, CODEC_NID(cmd), CODEC_NID(cmd))); … … 1009 1006 } 1010 1007 1008 1009 /** 1010 * @interface_method_impl{CODECVERB, pfn, ???} 1011 */ 1011 1012 static DECLCALLBACK(int) vrbProcGetParameter(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1012 1013 { … … 1025 1026 } 1026 1027 1027 /* F01 */ 1028 1029 /** 1030 * @interface_method_impl{CODECVERB, pfn, f01} 1031 */ 1028 1032 static DECLCALLBACK(int) vrbProcGetConSelectCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1029 1033 { … … 1047 1051 } 1048 1052 1049 /* 701 */ 1053 1054 /** 1055 * @interface_method_impl{CODECVERB, pfn, 701} 1056 */ 1050 1057 static DECLCALLBACK(int) vrbProcSetConSelectCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1051 1058 { … … 1073 1080 } 1074 1081 1075 /* F07 */ 1082 1083 /** 1084 * @interface_method_impl{CODECVERB, pfn, f07} 1085 */ 1076 1086 static DECLCALLBACK(int) vrbProcGetPinCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1077 1087 { … … 1097 1107 } 1098 1108 1099 /* 707 */ 1109 1110 /** 1111 * @interface_method_impl{CODECVERB, pfn, 707} 1112 */ 1100 1113 static DECLCALLBACK(int) vrbProcSetPinCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1101 1114 { … … 1126 1139 } 1127 1140 1128 /* F08 */ 1141 1142 /** 1143 * @interface_method_impl{CODECVERB, pfn, f08} 1144 */ 1129 1145 static DECLCALLBACK(int) vrbProcGetUnsolicitedEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1130 1146 { … … 1150 1166 } 1151 1167 1152 /* 708 */ 1168 1169 /** 1170 * @interface_method_impl{CODECVERB, pfn, 708} 1171 */ 1153 1172 static DECLCALLBACK(int) vrbProcSetUnsolicitedEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1154 1173 { … … 1178 1197 } 1179 1198 1180 /* F09 */ 1199 1200 /** 1201 * @interface_method_impl{CODECVERB, pfn, f09} 1202 */ 1181 1203 static DECLCALLBACK(int) vrbProcGetPinSense(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1182 1204 { … … 1197 1219 } 1198 1220 1199 /* 709 */ 1221 1222 /** 1223 * @interface_method_impl{CODECVERB, pfn, 709} 1224 */ 1200 1225 static DECLCALLBACK(int) vrbProcSetPinSense(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1201 1226 { … … 1217 1242 } 1218 1243 1244 1245 /** 1246 * @interface_method_impl{CODECVERB, pfn, ???} 1247 */ 1219 1248 static DECLCALLBACK(int) vrbProcGetConnectionListEntry(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1220 1249 { … … 1232 1261 } 1233 1262 1234 /* F03 */ 1263 1264 /** 1265 * @interface_method_impl{CODECVERB, pfn, f03} 1266 */ 1235 1267 static DECLCALLBACK(int) vrbProcGetProcessingState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1236 1268 { … … 1244 1276 } 1245 1277 1246 /* 703 */ 1278 1279 /** 1280 * @interface_method_impl{CODECVERB, pfn, 703} 1281 */ 1247 1282 static DECLCALLBACK(int) vrbProcSetProcessingState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1248 1283 { … … 1255 1290 } 1256 1291 1257 /* F0D */ 1292 1293 /** 1294 * @interface_method_impl{CODECVERB, pfn, f0d} 1295 */ 1258 1296 static DECLCALLBACK(int) vrbProcGetDigitalConverter(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1259 1297 { … … 1269 1307 } 1270 1308 1309 1271 1310 static int codecSetDigitalConverter(PHDACODEC pThis, uint32_t cmd, uint8_t u8Offset, uint64_t *pResp) 1272 1311 { … … 1280 1319 } 1281 1320 1282 /* 70D */ 1321 1322 /** 1323 * @interface_method_impl{CODECVERB, pfn, 70d} 1324 */ 1283 1325 static DECLCALLBACK(int) vrbProcSetDigitalConverter1(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1284 1326 { … … 1287 1329 } 1288 1330 1289 /* 70E */ 1331 1332 /** 1333 * @interface_method_impl{CODECVERB, pfn, 70e} 1334 */ 1290 1335 static DECLCALLBACK(int) vrbProcSetDigitalConverter2(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1291 1336 { … … 1294 1339 } 1295 1340 1296 /* F20 */ 1341 1342 /** 1343 * @interface_method_impl{CODECVERB, pfn, f20} 1344 */ 1297 1345 static DECLCALLBACK(int) vrbProcGetSubId(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1298 1346 { … … 1314 1362 } 1315 1363 1364 1316 1365 static int codecSetSubIdX(PHDACODEC pThis, uint32_t cmd, uint8_t u8Offset) 1317 1366 { … … 1333 1382 } 1334 1383 1335 /* 720 */ 1384 1385 /** 1386 * @interface_method_impl{CODECVERB, pfn, 720} 1387 */ 1336 1388 static DECLCALLBACK(int) vrbProcSetSubId0(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1337 1389 { … … 1341 1393 } 1342 1394 1343 /* 721 */ 1395 1396 /** 1397 * @interface_method_impl{CODECVERB, pfn, 721} 1398 */ 1344 1399 static DECLCALLBACK(int) vrbProcSetSubId1(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1345 1400 { … … 1349 1404 } 1350 1405 1351 /* 722 */ 1406 1407 /** 1408 * @interface_method_impl{CODECVERB, pfn, 722} 1409 */ 1352 1410 static DECLCALLBACK(int) vrbProcSetSubId2(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1353 1411 { … … 1357 1415 } 1358 1416 1359 /* 723 */ 1417 1418 /** 1419 * @interface_method_impl{CODECVERB, pfn, 723} 1420 */ 1360 1421 static DECLCALLBACK(int) vrbProcSetSubId3(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1361 1422 { … … 1365 1426 } 1366 1427 1428 1429 /** 1430 * @interface_method_impl{CODECVERB, pfn, ???} 1431 */ 1367 1432 static DECLCALLBACK(int) vrbProcReset(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1368 1433 { … … 1384 1449 } 1385 1450 1386 /* F05 */ 1451 1452 /** 1453 * @interface_method_impl{CODECVERB, pfn, f05} 1454 */ 1387 1455 static DECLCALLBACK(int) vrbProcGetPowerState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1388 1456 { … … 1414 1482 } 1415 1483 1416 /* 705 */1417 1484 #if 1 1485 1486 /** 1487 * @interface_method_impl{CODECVERB, pfn, 705} 1488 */ 1418 1489 static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1419 1490 { … … 1469 1540 LogFunc(("Propagating Act=D%RU8 (AFG), Set=D%RU8 to all AFG child nodes ...\n", uAFGPwrAct, uPwrCmd)); 1470 1541 1471 #define PROPAGATE_PWR_STATE(_aList, _aMember) \ 1472 { \ 1473 const uint8_t *pu8NodeIndex = &_aList[0]; \ 1474 while (*(++pu8NodeIndex)) \ 1542 #define PROPAGATE_PWR_STATE(a_abList, a_Member) \ 1543 do { \ 1544 for (uintptr_t idxList = 0; idxList < RT_ELEMENTS(a_abList); idxList++) \ 1475 1545 { \ 1476 pThis->aNodes[*pu8NodeIndex]._aMember.u32F05_param = \ 1477 CODEC_MAKE_F05(fReset, fStopOk, 0, uAFGPwrAct, uPwrCmd); \ 1478 LogFunc(("\t[NID0x%02x]: Act=D%RU8, Set=D%RU8\n", *pu8NodeIndex, \ 1479 CODEC_F05_ACT(pThis->aNodes[*pu8NodeIndex]._aMember.u32F05_param), \ 1480 CODEC_F05_SET(pThis->aNodes[*pu8NodeIndex]._aMember.u32F05_param))); \ 1546 uint8_t const idxNode = a_abList[idxList]; \ 1547 if (idxNode) \ 1548 { \ 1549 pThis->aNodes[idxNode].a_Member.u32F05_param = CODEC_MAKE_F05(fReset, fStopOk, 0, uAFGPwrAct, uPwrCmd); \ 1550 LogFunc(("\t[NID0x%02x]: Act=D%RU8, Set=D%RU8\n", idxNode, \ 1551 CODEC_F05_ACT(pThis->aNodes[idxNode].a_Member.u32F05_param), \ 1552 CODEC_F05_SET(pThis->aNodes[idxNode].a_Member.u32F05_param))); \ 1553 } \ 1554 else \ 1555 break; \ 1481 1556 } \ 1482 } 1557 } while (0) 1483 1558 1484 1559 PROPAGATE_PWR_STATE(pThis->au8Dacs, dac); … … 1507 1582 return VINF_SUCCESS; 1508 1583 } 1584 1509 1585 #else 1586 1510 1587 DECLINLINE(void) codecPropogatePowerState(uint32_t *pu32F05_param) 1511 1588 { … … 1519 1596 } 1520 1597 1598 1599 /** 1600 * @interface_method_impl{CODECVERB, pfn, 705} 1601 */ 1521 1602 static DECLCALLBACK(int) vrbProcSetPowerState(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1522 1603 { … … 1587 1668 return VINF_SUCCESS; 1588 1669 } 1670 1589 1671 #endif 1590 1672 1591 /* F06 */ 1673 /** 1674 * @interface_method_impl{CODECVERB, pfn, f06} 1675 */ 1592 1676 static DECLCALLBACK(int) vrbProcGetStreamId(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1593 1677 { … … 1614 1698 } 1615 1699 1616 /* A0 */ 1700 1701 /** 1702 * @interface_method_impl{CODECVERB, pfn, a0} 1703 */ 1617 1704 static DECLCALLBACK(int) vrbProcGetConverterFormat(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1618 1705 { … … 1636 1723 } 1637 1724 1638 /* Also see section 3.7.1. */ 1725 1726 /** 1727 * @interface_method_impl{CODECVERB, pfn, ??? - Also see section 3.7.1.} 1728 */ 1639 1729 static DECLCALLBACK(int) vrbProcSetConverterFormat(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1640 1730 { … … 1656 1746 } 1657 1747 1658 /* F0C */ 1748 1749 /** 1750 * @interface_method_impl{CODECVERB, pfn, f0c} 1751 */ 1659 1752 static DECLCALLBACK(int) vrbProcGetEAPD_BTLEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1660 1753 { … … 1674 1767 } 1675 1768 1676 /* 70C */ 1769 1770 /** 1771 * @interface_method_impl{CODECVERB, pfn, 70c} 1772 */ 1677 1773 static DECLCALLBACK(int) vrbProcSetEAPD_BTLEnabled(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1678 1774 { … … 1696 1792 } 1697 1793 1698 /* F0F */ 1794 1795 /** 1796 * @interface_method_impl{CODECVERB, pfn, f0f} 1797 */ 1699 1798 static DECLCALLBACK(int) vrbProcGetVolumeKnobCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1700 1799 { … … 1710 1809 } 1711 1810 1712 /* 70F */ 1811 1812 /** 1813 * @interface_method_impl{CODECVERB, pfn, 70f} 1814 */ 1713 1815 static DECLCALLBACK(int) vrbProcSetVolumeKnobCtrl(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1714 1816 { … … 1728 1830 } 1729 1831 1730 /* F15 */ 1832 1833 /** 1834 * @interface_method_impl{CODECVERB, pfn, f15} 1835 */ 1731 1836 static DECLCALLBACK(int) vrbProcGetGPIOData(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1732 1837 { … … 1736 1841 } 1737 1842 1738 /* 715 */ 1843 1844 /** 1845 * @interface_method_impl{CODECVERB, pfn, 715} 1846 */ 1739 1847 static DECLCALLBACK(int) vrbProcSetGPIOData(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1740 1848 { … … 1744 1852 } 1745 1853 1746 /* F16 */ 1854 1855 /** 1856 * @interface_method_impl{CODECVERB, pfn, f16} 1857 */ 1747 1858 static DECLCALLBACK(int) vrbProcGetGPIOEnableMask(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1748 1859 { … … 1752 1863 } 1753 1864 1754 /* 716 */ 1865 1866 /** 1867 * @interface_method_impl{CODECVERB, pfn, 716} 1868 */ 1755 1869 static DECLCALLBACK(int) vrbProcSetGPIOEnableMask(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1756 1870 { … … 1760 1874 } 1761 1875 1762 /* F17 */ 1876 1877 /** 1878 * @interface_method_impl{CODECVERB, pfn, f17} 1879 */ 1763 1880 static DECLCALLBACK(int) vrbProcGetGPIODirection(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1764 1881 { … … 1775 1892 } 1776 1893 1777 /* 717 */ 1894 1895 /** 1896 * @interface_method_impl{CODECVERB, pfn, 717} 1897 */ 1778 1898 static DECLCALLBACK(int) vrbProcSetGPIODirection(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1779 1899 { … … 1793 1913 } 1794 1914 1795 /* F1C */ 1915 1916 /** 1917 * @interface_method_impl{CODECVERB, pfn, f1c} 1918 */ 1796 1919 static DECLCALLBACK(int) vrbProcGetConfig(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1797 1920 { … … 1841 1964 } 1842 1965 1843 /* 71C */ 1966 1967 /** 1968 * @interface_method_impl{CODECVERB, pfn, 71c} 1969 */ 1844 1970 static DECLCALLBACK(int) vrbProcSetConfig0(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1845 1971 { … … 1849 1975 } 1850 1976 1851 /* 71D */ 1977 1978 /** 1979 * @interface_method_impl{CODECVERB, pfn, 71d} 1980 */ 1852 1981 static DECLCALLBACK(int) vrbProcSetConfig1(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1853 1982 { … … 1857 1986 } 1858 1987 1859 /* 71E */ 1988 1989 /** 1990 * @interface_method_impl{CODECVERB, pfn, 71e} 1991 */ 1860 1992 static DECLCALLBACK(int) vrbProcSetConfig2(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1861 1993 { … … 1865 1997 } 1866 1998 1867 /* 71E */ 1999 2000 /** 2001 * @interface_method_impl{CODECVERB, pfn, 71e} 2002 */ 1868 2003 static DECLCALLBACK(int) vrbProcSetConfig3(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1869 2004 { … … 1873 2008 } 1874 2009 1875 /* F04 */ 2010 2011 /** 2012 * @interface_method_impl{CODECVERB, pfn, f04} 2013 */ 1876 2014 static DECLCALLBACK(int) vrbProcGetSDISelect(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1877 2015 { … … 1887 2025 } 1888 2026 1889 /* 704 */ 2027 2028 /** 2029 * @interface_method_impl{CODECVERB, pfn, 704} 2030 */ 1890 2031 static DECLCALLBACK(int) vrbProcSetSDISelect(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1891 2032 { … … 1907 2048 #ifdef IN_RING3 1908 2049 1909 /* 3-- */ 2050 /** 2051 * @interface_method_impl{CODECVERB, pfn, 3--} 2052 */ 1910 2053 static DECLCALLBACK(int) vrbProcR3SetAmplifier(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1911 2054 { … … 1972 2115 } 1973 2116 1974 /* 706 */ 2117 2118 /** 2119 * @interface_method_impl{CODECVERB, pfn, 706} 2120 */ 1975 2121 static DECLCALLBACK(int) vrbProcR3SetStreamId(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t cmd, uint64_t *pResp) 1976 2122 { … … 2105 2251 2106 2252 2253 /** 2254 * Implements 2255 */ 2256 static DECLCALLBACK(int) codecLookup(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t uCmd, uint64_t *puResp) 2257 { 2258 /* 2259 * Clear the return value and assert some sanity. 2260 */ 2261 AssertPtr(puResp); 2262 *puResp = 0; 2263 AssertPtr(pThis); 2264 AssertPtr(pThisCC); 2265 AssertMsgReturn(CODEC_CAD(uCmd) == pThis->id, 2266 ("Unknown codec address 0x%x\n", CODEC_CAD(uCmd)), 2267 VERR_INVALID_PARAMETER); 2268 uint32_t const uCmdData = CODEC_VERBDATA(uCmd); 2269 AssertMsgReturn( uCmdData != 0 2270 && CODEC_NID(uCmd) < RT_MIN(pThis->cTotalNodes, RT_ELEMENTS(pThis->aNodes)), 2271 ("[NID0x%02x] Unknown / invalid node or data (0x%x)\n", CODEC_NID(uCmd), uCmdData), 2272 VERR_INVALID_PARAMETER); 2273 STAM_COUNTER_INC(&pThis->CTX_SUFF(StatLookups)); 2274 2275 /* 2276 * Do a binary lookup of the verb. 2277 * Note! if we want other verb tables, add a table selector before the loop. 2278 */ 2279 size_t iFirst = 0; 2280 size_t iEnd = RT_ELEMENTS(g_aCodecVerbs); 2281 for (;;) 2282 { 2283 size_t const iCur = iFirst + (iEnd - iFirst) / 2; 2284 uint32_t const uVerb = g_aCodecVerbs[iCur].uVerb; 2285 if (uCmdData < uVerb) 2286 { 2287 if (iCur > iFirst) 2288 iEnd = iCur; 2289 else 2290 break; 2291 } 2292 else if ((uCmdData & g_aCodecVerbs[iCur].fMask) != uVerb) 2293 { 2294 if (iCur + 1 < iEnd) 2295 iFirst = iCur + 1; 2296 else 2297 break; 2298 } 2299 else 2300 { 2301 /* 2302 * Found it! Run the callback and return. 2303 */ 2304 #ifndef IN_RING3 2305 if (!g_aCodecVerbs[iCur].pfn) 2306 { 2307 Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> VERR_INVALID_CONTEXT\n", /* -> ring-3 */ 2308 CODEC_NID(uCmd), g_aCodecVerbs[iCur].uVerb, g_aCodecVerbs[iCur].pszName, CODEC_VERB_PAYLOAD8(uCmd))); 2309 return VERR_INVALID_CONTEXT; 2310 } 2311 #endif 2312 AssertPtrReturn(g_aCodecVerbs[iCur].pfn, VERR_INTERNAL_ERROR_5); /* Paranoia^2. */ 2313 2314 int rc = g_aCodecVerbs[iCur].pfn(pThis, pThisCC, uCmd, puResp); 2315 AssertRC(rc); 2316 Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> 0x%x\n", 2317 CODEC_NID(uCmd), g_aCodecVerbs[iCur].uVerb, g_aCodecVerbs[iCur].pszName, CODEC_VERB_PAYLOAD8(uCmd), *puResp)); 2318 return rc; 2319 } 2320 } 2321 2322 #ifdef VBOX_STRICT 2323 for (size_t i = 0; i < RT_ELEMENTS(g_aCodecVerbs); i++) 2324 { 2325 AssertMsg(i == 0 || g_aCodecVerbs[i - 1].uVerb < g_aCodecVerbs[i].uVerb, 2326 ("i=%#x uVerb[-1]=%#x uVerb=%#x - buggy table!\n", i, g_aCodecVerbs[i - 1].uVerb, g_aCodecVerbs[i].uVerb)); 2327 AssertMsg((uCmdData & g_aCodecVerbs[i].fMask) != g_aCodecVerbs[i].uVerb, 2328 ("i=%#x uVerb=%#x uCmd=%#x - buggy binary search or table!\n", i, g_aCodecVerbs[i].uVerb, uCmd)); 2329 } 2330 #endif 2331 LogFunc(("[NID0x%02x] Callback for %x not found\n", CODEC_NID(uCmd), CODEC_VERBDATA(uCmd))); 2332 return VERR_NOT_FOUND; 2333 } 2334 2335 2336 /********************************************************************************************************************************* 2337 * Debug * 2338 *********************************************************************************************************************************/ 2107 2339 #ifdef IN_RING3 2108 2340 … … 2122 2354 typedef CODECDEBUG *PCODECDEBUG; 2123 2355 2124 #define CODECDBG_INDENT pInfo->uLevel++; 2125 #define CODECDBG_UNINDENT if (pInfo->uLevel) pInfo->uLevel--; 2126 2127 #define CODECDBG_PRINT(...) pInfo->pHlp->pfnPrintf(pInfo->pHlp, __VA_ARGS__) 2128 #define CODECDBG_PRINTI(...) codecDbgPrintf(pInfo, __VA_ARGS__) 2356 # define CODECDBG_INDENT pInfo->uLevel++; 2357 # define CODECDBG_UNINDENT if (pInfo->uLevel) pInfo->uLevel--; 2358 2359 # define CODECDBG_PRINT(...) pInfo->pHlp->pfnPrintf(pInfo->pHlp, __VA_ARGS__) 2360 # define CODECDBG_PRINTI(...) codecDbgPrintf(pInfo, __VA_ARGS__) 2361 2129 2362 2130 2363 /** Wrapper around DBGFINFOHLP::pfnPrintf that adds identation. */ … … 2137 2370 } 2138 2371 2372 2139 2373 /** Power state */ 2140 2374 static void codecDbgPrintNodeRegF05(PCODECDEBUG pInfo, uint32_t u32Reg) … … 2144 2378 } 2145 2379 2380 2146 2381 static void codecDbgPrintNodeRegA(PCODECDEBUG pInfo, uint32_t u32Reg) 2147 2382 { 2148 2383 codecDbgPrintf(pInfo, "RegA: %x\n", u32Reg); 2149 2384 } 2385 2150 2386 2151 2387 static void codecDbgPrintNodeRegF00(PCODECDEBUG pInfo, uint32_t *paReg00) … … 2174 2410 } 2175 2411 2412 2176 2413 static void codecDbgPrintNodeAmp(PCODECDEBUG pInfo, uint32_t *paReg, uint8_t uIdx, uint8_t uDir) 2177 2414 { … … 2191 2428 } 2192 2429 2430 2193 2431 # if 0 /* unused */ 2194 2432 static void codecDbgPrintNodeConnections(PCODECDEBUG pInfo, PCODECNODE pNode) … … 2202 2440 # endif 2203 2441 2442 2204 2443 static void codecDbgPrintNode(PCODECDEBUG pInfo, PCODECNODE pNode, bool fRecursive) 2205 2444 { … … 2207 2446 2208 2447 if (pNode->node.uID == STAC9220_NID_ROOT) 2209 {2210 2448 CODECDBG_PRINT("ROOT\n"); 2211 }2212 2449 else if (pNode->node.uID == STAC9220_NID_AFG) 2213 2450 { … … 2219 2456 } 2220 2457 else if (hdaCodecIsPortNode(pInfo->pThis, pNode->node.uID)) 2221 {2222 2458 CODECDBG_PRINT("PORT\n"); 2223 }2224 2459 else if (hdaCodecIsDacNode(pInfo->pThis, pNode->node.uID)) 2225 2460 { … … 2312 2547 } 2313 2548 2549 2314 2550 static DECLCALLBACK(void) codecR3DbgListNodes(PHDACODEC pThis, PHDACODECR3 pThisCC, PCDBGFINFOHLP pHlp, const char *pszArgs) 2315 2551 { … … 2318 2554 pHlp->pfnPrintf(pHlp, "HDA LINK / INPUTS\n"); 2319 2555 2320 CODECDEBUG dbgInfo;2321 dbgInfo.pHlp = pHlp;2322 dbgInfo.pThis = pThis;2323 dbgInfo.uLevel = 0;2324 2325 PCODECDEBUG pInfo = & dbgInfo;2556 CODECDEBUG DbgInfo; 2557 DbgInfo.pHlp = pHlp; 2558 DbgInfo.pThis = pThis; 2559 DbgInfo.uLevel = 0; 2560 2561 PCODECDEBUG pInfo = &DbgInfo; 2326 2562 2327 2563 CODECDBG_INDENT … … 2332 2568 /* Start with all nodes which have connection entries set. */ 2333 2569 if (CODEC_F00_0E_COUNT(pNode->node.au32F00_param[0xE])) 2334 codecDbgPrintNode(& dbgInfo, pNode, true /* fRecursive */);2570 codecDbgPrintNode(&DbgInfo, pNode, true /* fRecursive */); 2335 2571 } 2336 2572 CODECDBG_UNINDENT 2337 2573 } 2338 2574 2575 2339 2576 static DECLCALLBACK(void) codecR3DbgSelector(PHDACODEC pThis, PHDACODECR3 pThisCC, PCDBGFINFOHLP pHlp, const char *pszArgs) 2340 2577 { … … 2342 2579 } 2343 2580 2581 2582 # if 0 /* unused */ 2583 static DECLCALLBACK(void) stac9220DbgNodes(PHDACODEC pThis, PCDBGFINFOHLP pHlp, const char *pszArgs) 2584 { 2585 RT_NOREF(pszArgs); 2586 uint8_t const cTotalNodes = RT_MIN(pThis->cTotalNodes, RT_ELEMENTS(pThis->aNodes)); 2587 for (uint8_t i = 1; i < cTotalNodes; i++) 2588 { 2589 PCODECNODE pNode = &pThis->aNodes[i]; 2590 AMPLIFIER *pAmp = &pNode->dac.B_params; 2591 2592 uint8_t lVol = AMPLIFIER_REGISTER(*pAmp, AMPLIFIER_OUT, AMPLIFIER_LEFT, 0) & 0x7f; 2593 uint8_t rVol = AMPLIFIER_REGISTER(*pAmp, AMPLIFIER_OUT, AMPLIFIER_RIGHT, 0) & 0x7f; 2594 2595 pHlp->pfnPrintf(pHlp, "0x%x: lVol=%RU8, rVol=%RU8\n", i, lVol, rVol); 2596 } 2597 } 2598 # endif 2599 2344 2600 #endif /* IN_RING3 */ 2345 2601 2346 /** 2347 * Implements 2348 */ 2349 static DECLCALLBACK(int) codecLookup(PHDACODEC pThis, PHDACODECCC pThisCC, uint32_t uCmd, uint64_t *puResp) 2350 { 2351 /* 2352 * Clear the return value and assert some sanity. 2353 */ 2354 AssertPtr(puResp); 2355 *puResp = 0; 2356 AssertPtr(pThis); 2357 AssertPtr(pThisCC); 2358 AssertMsgReturn(CODEC_CAD(uCmd) == pThis->id, 2359 ("Unknown codec address 0x%x\n", CODEC_CAD(uCmd)), 2360 VERR_INVALID_PARAMETER); 2361 uint32_t const uCmdData = CODEC_VERBDATA(uCmd); 2362 AssertMsgReturn( uCmdData != 0 2363 && CODEC_NID(uCmd) < RT_MIN(pThis->cTotalNodes, RT_ELEMENTS(pThis->aNodes)), 2364 ("[NID0x%02x] Unknown / invalid node or data (0x%x)\n", CODEC_NID(uCmd), uCmdData), 2365 VERR_INVALID_PARAMETER); 2366 STAM_COUNTER_INC(&pThis->CTX_SUFF(StatLookups)); 2367 2368 /* 2369 * Do a binary lookup of the verb. 2370 * Note! if we want other verb tables, add a table selector before the loop. 2371 */ 2372 size_t iFirst = 0; 2373 size_t iEnd = RT_ELEMENTS(g_aCodecVerbs); 2374 for (;;) 2375 { 2376 size_t const iCur = iFirst + (iEnd - iFirst) / 2; 2377 uint32_t const uVerb = g_aCodecVerbs[iCur].uVerb; 2378 if (uCmdData < uVerb) 2379 { 2380 if (iCur > iFirst) 2381 iEnd = iCur; 2382 else 2383 break; 2384 } 2385 else if ((uCmdData & g_aCodecVerbs[iCur].fMask) != uVerb) 2386 { 2387 if (iCur + 1 < iEnd) 2388 iFirst = iCur + 1; 2389 else 2390 break; 2391 } 2392 else 2393 { 2394 /* 2395 * Found it! Run the callback and return. 2396 */ 2397 #ifndef IN_RING3 2398 if (!g_aCodecVerbs[iCur].pfn) 2399 { 2400 Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> VERR_INVALID_CONTEXT\n", /* -> ring-3 */ 2401 CODEC_NID(uCmd), g_aCodecVerbs[iCur].uVerb, g_aCodecVerbs[iCur].pszName, CODEC_VERB_PAYLOAD8(uCmd))); 2402 return VERR_INVALID_CONTEXT; 2403 } 2404 #endif 2405 AssertPtrReturn(g_aCodecVerbs[iCur].pfn, VERR_INTERNAL_ERROR_5); /* Paranoia^2. */ 2406 2407 int rc = g_aCodecVerbs[iCur].pfn(pThis, pThisCC, uCmd, puResp); 2408 AssertRC(rc); 2409 Log3Func(("[NID0x%02x] (0x%x) %s: 0x%x -> 0x%x\n", 2410 CODEC_NID(uCmd), g_aCodecVerbs[iCur].uVerb, g_aCodecVerbs[iCur].pszName, CODEC_VERB_PAYLOAD8(uCmd), *puResp)); 2411 return rc; 2412 } 2413 } 2414 2415 #ifdef VBOX_STRICT 2416 for (size_t i = 0; i < RT_ELEMENTS(g_aCodecVerbs); i++) 2417 { 2418 AssertMsg(i == 0 || g_aCodecVerbs[i - 1].uVerb < g_aCodecVerbs[i].uVerb, 2419 ("i=%#x uVerb[-1]=%#x uVerb=%#x - buggy table!\n", i, g_aCodecVerbs[i - 1].uVerb, g_aCodecVerbs[i].uVerb)); 2420 AssertMsg((uCmdData & g_aCodecVerbs[i].fMask) != g_aCodecVerbs[i].uVerb, 2421 ("i=%#x uVerb=%#x uCmd=%#x - buggy binary search or table!\n", i, g_aCodecVerbs[i].uVerb, uCmd)); 2422 } 2423 #endif 2424 LogFunc(("[NID0x%02x] Callback for %x not found\n", CODEC_NID(uCmd), CODEC_VERBDATA(uCmd))); 2425 return VERR_NOT_FOUND; 2426 } 2427 2428 2429 /* 2430 * APIs exposed to DevHDA. 2431 */ 2602 2603 2604 /********************************************************************************************************************************* 2605 * DevHDA API * 2606 *********************************************************************************************************************************/ 2432 2607 2433 2608 #ifdef IN_RING3 … … 2469 2644 } 2470 2645 2646 2471 2647 int hdaR3CodecRemoveStream(PHDACODECR3 pThisCC, PDMAUDIOMIXERCTL enmMixerCtl, bool fImmediate) 2472 2648 { … … 2478 2654 return rc; 2479 2655 } 2656 2480 2657 2481 2658 int hdaCodecSaveState(PPDMDEVINS pDevIns, PHDACODEC pThis, PSSMHANDLE pSSM) … … 2491 2668 } 2492 2669 2670 2493 2671 int hdaR3CodecLoadState(PPDMDEVINS pDevIns, PHDACODEC pThis, PHDACODECR3 pThisCC, PSSMHANDLE pSSM, uint32_t uVersion) 2494 2672 { … … 2555 2733 return VINF_SUCCESS; 2556 2734 } 2735 2557 2736 2558 2737 /** … … 2587 2766 } 2588 2767 2768 2589 2769 /** 2590 2770 * Constructs a codec (ring-3).
Note:
See TracChangeset
for help on using the changeset viewer.