VirtualBox

Changeset 34061 in vbox


Ignore:
Timestamp:
Nov 15, 2010 6:02:31 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67743
Message:

Audio/HDA: usage/accessing SDnFIFO registers with respect to ICH6 datasheet (18.2.39).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DevIchIntelHDA.cpp

    r33881 r34061  
    310310#define ICH6_HDA_REG_SD7FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 70) /* 0x170 */
    311311
     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 */
    312325#define SDFIFOS(pState, num) HDA_REG((pState), SD(FIFOS, num))
    313326
     
    439452DECLCALLBACK(int)hdaRegWriteSDSTS(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value);
    440453DECLCALLBACK(int)hdaRegWriteSDLVI(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value);
     454DECLCALLBACK(int)hdaRegWriteSDFIFOS(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value);
    441455DECLCALLBACK(int)hdaRegWriteSDBDPL(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value);
    442456DECLCALLBACK(int)hdaRegWriteSDBDPU(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value);
     
    517531    { 0x0008C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD0LVI"  , "ISD0 Last Valid Index" },
    518532    { 0x0008E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "ISD0FIFOW", "ISD0 FIFO Watermark" },
    519     { 0x00090, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "ISD0FIFOS", "ISD0 FIFO Size" },
     533    { 0x00090, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD0FIFOS", "ISD0 FIFO Size" },
    520534    { 0x00092, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "ISD0FMT"  , "ISD0 Format" },
    521535    { 0x00098, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD0BDPL" , "ISD0 Buffer Descriptor List Pointer-Lower Base Address" },
     
    528542    { 0x000AC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD1LVI"  , "ISD1 Last Valid Index" },
    529543    { 0x000AE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "ISD1FIFOW", "ISD1 FIFO Watermark" },
    530     { 0x000B0, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "ISD1FIFOS", "ISD1 FIFO Size" },
     544    { 0x000B0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD1FIFOS", "ISD1 FIFO Size" },
    531545    { 0x000B2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "ISD1FMT"  , "ISD1 Format" },
    532546    { 0x000B8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD1BDPL" , "ISD1 Buffer Descriptor List Pointer-Lower Base Address" },
     
    539553    { 0x000CC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD2LVI"  , "ISD2 Last Valid Index" },
    540554    { 0x000CE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "ISD2FIFOW", "ISD2 FIFO Watermark" },
    541     { 0x000D0, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "ISD2FIFOS", "ISD2 FIFO Size" },
     555    { 0x000D0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD2FIFOS", "ISD2 FIFO Size" },
    542556    { 0x000D2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "ISD2FMT"  , "ISD2 Format" },
    543557    { 0x000D8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD2BDPL" , "ISD2 Buffer Descriptor List Pointer-Lower Base Address" },
     
    550564    { 0x000EC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD3LVI"  , "ISD3 Last Valid Index" },
    551565    { 0x000EE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "ISD3FIFOW", "ISD3 FIFO Watermark" },
    552     { 0x000F0, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "ISD3FIFOS", "ISD3 FIFO Size" },
     566    { 0x000F0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD3FIFOS", "ISD3 FIFO Size" },
    553567    { 0x000F2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "ISD3FMT"  , "ISD3 Format" },
    554568    { 0x000F8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD3BDPL" , "ISD3 Buffer Descriptor List Pointer-Lower Base Address" },
     
    561575    { 0x0010C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD0LVI"  , "OSD0 Last Valid Index" },
    562576    { 0x0010E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "OSD0FIFOW", "OSD0 FIFO Watermark" },
    563     { 0x00110, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "OSD0FIFOS", "OSD0 FIFO Size" },
     577    { 0x00110, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD0FIFOS", "OSD0 FIFO Size" },
    564578    { 0x00112, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "OSD0FMT"  , "OSD0 Format" },
    565579    { 0x00118, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD0BDPL" , "OSD0 Buffer Descriptor List Pointer-Lower Base Address" },
     
    572586    { 0x0012C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD1LVI"  , "OSD1 Last Valid Index" },
    573587    { 0x0012E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "OSD1FIFOW", "OSD1 FIFO Watermark" },
    574     { 0x00130, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "OSD1FIFOS", "OSD1 FIFO Size" },
     588    { 0x00130, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD1FIFOS", "OSD1 FIFO Size" },
    575589    { 0x00132, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "OSD1FMT"  , "OSD1 Format" },
    576590    { 0x00138, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD1BDPL" , "OSD1 Buffer Descriptor List Pointer-Lower Base Address" },
     
    583597    { 0x0014C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD2LVI"  , "OSD2 Last Valid Index" },
    584598    { 0x0014E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "OSD2FIFOW", "OSD2 FIFO Watermark" },
    585     { 0x00150, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "OSD2FIFOS", "OSD2 FIFO Size" },
     599    { 0x00150, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD2FIFOS", "OSD2 FIFO Size" },
    586600    { 0x00152, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "OSD2FMT"  , "OSD2 Format" },
    587601    { 0x00158, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD2BDPL" , "OSD2 Buffer Descriptor List Pointer-Lower Base Address" },
     
    594608    { 0x0016C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD3LVI"  , "OSD3 Last Valid Index" },
    595609    { 0x0016E, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "OSD3FIFOW", "OSD3 FIFO Watermark" },
    596     { 0x00170, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "OSD3FIFOS", "OSD3 FIFO Size" },
     610    { 0x00170, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD3FIFOS", "OSD3 FIFO Size" },
    597611    { 0x00172, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteU16          , "OSD3FMT"  , "OSD3 Format" },
    598612    { 0x00178, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD3BDPL" , "OSD3 Buffer Descriptor List Pointer-Lower Base Address" },
     
    10401054        AssertRCReturn(rc, VINF_SUCCESS);
    10411055    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 */
     1062DECLCALLBACK(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;
    10421096}
    10431097
     
    12121266static uint32_t hdaReadAudio(INTELHDLinkState *pState, int avail, bool *fStop)
    12131267{
    1214     uint8_t tmpbuf[512];
     1268    uint8_t tmpbuf[256];
    12151269    uint32_t temp;
    12161270    uint32_t u32Rest = 0;
     
    12301284    {
    12311285        int copied;
    1232         to_copy = audio_MIN(temp, SDFIFOS(pState, 4) & ~((1<<4) - 1));
     1286        to_copy = audio_MIN(temp, SDFIFOS(pState, 4) + 1);
    12331287        copied = AUD_read (voice, tmpbuf, to_copy);
    12341288        Log (("hda: read_audio max=%x to_copy=%x copied=%x\n",
     
    12481302static uint32_t hdaWriteAudio(INTELHDLinkState *pState, int avail, bool *fStop)
    12491303{
    1250     uint8_t tmpbuf[512];
     1304    uint8_t tmpbuf[256];
    12511305    uint32_t temp;
    12521306    uint32_t u32Rest;
     
    12611315        return written;
    12621316    }
    1263     temp = audio_MIN(SDFIFOS(pState, 4) & ~((1<<4) - 1), temp);
     1317    temp = audio_MIN(SDFIFOS(pState, 4) + 1, temp);
    12641318    while (temp)
    12651319    {
     
    12681322        PDMDevHlpPhysRead(ICH6_HDASTATE_2_DEVINS(pState), pBdle->u64BdleCviAddr + pBdle->u32BdleCviPos, tmpbuf, to_copy);
    12691323        copied = AUD_write (OSD0FMT_TO_AUDIO_SELECTOR(pState), tmpbuf, to_copy);
    1270         Log (("hda: write_audio max=%x to_copy=%x copied=%x\n",
    1271               avail, to_copy, copied));
     1324        Log(("hda: write_audio max=%x to_copy=%x copied=%x\n",
     1325             avail, to_copy, copied));
    12721326        if (!copied)
    12731327        {
     
    16301684
    16311685    /* 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;
    16401694
    16411695    /* emulateion of codec "wake up" HDA spec (5.5.1 and 6.5)*/
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette