VirtualBox

Changeset 89887 in vbox for trunk/src


Ignore:
Timestamp:
Jun 24, 2021 12:30:53 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145345
Message:

DevHda: Merged DevHdaCommon.h into DevHda.h and mostly likewise with the corresponding code. bugref:9890

Location:
trunk/src/VBox/Devices
Files:
2 deleted
6 edited

Legend:

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

    r89885 r89887  
    401401};
    402402
    403 const HDAREGALIAS g_aHdaRegAliases[] =
     403/**
     404 * HDA register aliases (HDA spec 3.3.45).
     405 * @remarks Sorted by offReg.
     406 */
     407static struct HDAREGALIAS
     408{
     409    /** The alias register offset. */
     410    uint32_t    offReg;
     411    /** The register index. */
     412    int         idxAlias;
     413} const g_aHdaRegAliases[] =
    404414{
    405415    { 0x2030, HDA_REG_WALCLK  },
     
    497507    UINT32_C(0), UINT32_C(0x000000ff), UINT32_C(0x0000ffff), UINT32_C(0x00ffffff), UINT32_C(0xffffffff)
    498508};
     509
     510
     511
     512/**
     513 * Returns a new INTSTS value based on the current device state.
     514 *
     515 * @returns Determined INTSTS register value.
     516 * @param   pThis               The shared HDA device state.
     517 *
     518 * @remarks This function does *not* set INTSTS!
     519 */
     520static uint32_t hdaGetINTSTS(PHDASTATE pThis)
     521{
     522    uint32_t intSts = 0;
     523
     524    /* Check controller interrupts (RIRB, STATEST). */
     525    if (HDA_REG(pThis, RIRBSTS) & HDA_REG(pThis, RIRBCTL) & (HDA_RIRBCTL_ROIC | HDA_RIRBCTL_RINTCTL))
     526    {
     527        intSts |= HDA_INTSTS_CIS; /* Set the Controller Interrupt Status (CIS). */
     528    }
     529
     530    /* Check SDIN State Change Status Flags. */
     531    if (HDA_REG(pThis, STATESTS) & HDA_REG(pThis, WAKEEN))
     532    {
     533        intSts |= HDA_INTSTS_CIS; /* Touch Controller Interrupt Status (CIS). */
     534    }
     535
     536    /* For each stream, check if any interrupt status bit is set and enabled. */
     537    for (uint8_t iStrm = 0; iStrm < HDA_MAX_STREAMS; ++iStrm)
     538    {
     539        if (HDA_STREAM_REG(pThis, STS, iStrm) & HDA_STREAM_REG(pThis, CTL, iStrm) & (HDA_SDCTL_DEIE | HDA_SDCTL_FEIE  | HDA_SDCTL_IOCE))
     540        {
     541            Log3Func(("[SD%d] interrupt status set\n", iStrm));
     542            intSts |= RT_BIT(iStrm);
     543        }
     544    }
     545
     546    if (intSts)
     547        intSts |= HDA_INTSTS_GIS; /* Set the Global Interrupt Status (GIS). */
     548
     549    Log3Func(("-> 0x%x\n", intSts));
     550
     551    return intSts;
     552}
     553
     554
     555/**
     556 * Processes (asserts/deasserts) the HDA interrupt according to the current state.
     557 *
     558 * @param   pDevIns             The device instance.
     559 * @param   pThis               The shared HDA device state.
     560 * @param   pszSource           Caller information.
     561 */
     562#if defined(LOG_ENABLED) || defined(DOXYGEN_RUNNING)
     563void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis, const char *pszSource)
     564#else
     565void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis)
     566#endif
     567{
     568    uint32_t uIntSts = hdaGetINTSTS(pThis);
     569
     570    HDA_REG(pThis, INTSTS) = uIntSts;
     571
     572    /* NB: It is possible to have GIS set even when CIE/SIEn are all zero; the GIS bit does
     573     * not control the interrupt signal. See Figure 4 on page 54 of the HDA 1.0a spec.
     574     */
     575    /* Global Interrupt Enable (GIE) set? */
     576    if (   (HDA_REG(pThis, INTCTL) & HDA_INTCTL_GIE)
     577        && (HDA_REG(pThis, INTSTS) & HDA_REG(pThis, INTCTL) & (HDA_INTCTL_CIE | HDA_STRMINT_MASK)))
     578    {
     579        Log3Func(("Asserted (%s)\n", pszSource));
     580
     581        PDMDevHlpPCISetIrq(pDevIns, 0, 1 /* Assert */);
     582        pThis->u8IRQL = 1;
     583
     584#ifdef DEBUG
     585        pThis->Dbg.IRQ.tsAssertedNs = RTTimeNanoTS();
     586        pThis->Dbg.IRQ.tsProcessedLastNs = pThis->Dbg.IRQ.tsAssertedNs;
     587#endif
     588    }
     589    else
     590    {
     591        Log3Func(("Deasserted (%s)\n", pszSource));
     592
     593        PDMDevHlpPCISetIrq(pDevIns, 0, 0 /* Deassert */);
     594        pThis->u8IRQL = 0;
     595    }
     596}
    499597
    500598
     
    15521650}
    15531651
     1652/**
     1653 * Calculates the number of bytes of a FIFOW register.
     1654 *
     1655 * @return Number of bytes of a given FIFOW register.
     1656 * @param  u16RegFIFOW          FIFOW register to convert.
     1657 */
     1658uint8_t hdaSDFIFOWToBytes(uint16_t u16RegFIFOW)
     1659{
     1660    uint32_t cb;
     1661    switch (u16RegFIFOW)
     1662    {
     1663        case HDA_SDFIFOW_8B:  cb = 8;  break;
     1664        case HDA_SDFIFOW_16B: cb = 16; break;
     1665        case HDA_SDFIFOW_32B: cb = 32; break;
     1666        default:
     1667            AssertFailedStmt(cb = 32); /* Paranoia. */
     1668            break;
     1669    }
     1670
     1671    Assert(RT_IS_POWER_OF_TWO(cb));
     1672    return cb;
     1673}
     1674
    15541675static VBOXSTRICTRC hdaRegWriteSDFIFOW(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    15551676{
     
    21592280    int rc = VINF_SUCCESS;
    21602281
    2161     PHDASTREAM pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkLineIn);
     2282    PHDASTREAM pStream = pThisCC->SinkLineIn.pStreamShared;
    21622283    if (   pStream
    21632284        && AudioHlpStreamCfgIsValid(&pStream->State.Cfg))
     
    21692290
    21702291# ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
    2171     pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkMicIn);
     2292    pStream = pThisCC->SinkMicIn.pStreamShared;
    21722293    if (   pStream
    21732294        && AudioHlpStreamCfgIsValid(&pStream->State.Cfg))
     
    21792300# endif
    21802301
    2181     pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkFront);
     2302    pStream = pThisCC->SinkFront.pStreamShared;
    21822303    if (   pStream
    21832304        && AudioHlpStreamCfgIsValid(&pStream->State.Cfg))
     
    21892310
    21902311# ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
    2191     pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkCenterLFE);
     2312    pStream = pThisCC->SinkCenterLFE.pStreamShared;
    21922313    if (   pStream
    21932314        && AudioHlpStreamCfgIsValid(&pStream->State.Cfg))
     
    21982319    }
    21992320
    2200     pStream = hdaR3GetSharedStreamFromSink(&pThisCC->SinkRear);
     2321    pStream = pThisCC->SinkRear.pStreamShared;
    22012322    if (   pStream
    22022323        && AudioHlpStreamCfgIsValid(&pStream->State.Cfg))
     
    48574978    {
    48584979        struct HDAREGDESC const *pReg     = &g_aHdaRegMap[i];
    4859         struct HDAREGDESC const *pNextReg = i + 1 < RT_ELEMENTS(g_aHdaRegMap) ?  &g_aHdaRegMap[i + 1] : NULL;
     4980        struct HDAREGDESC const *pNextReg = i + 1 < RT_ELEMENTS(g_aHdaRegMap) ? &g_aHdaRegMap[i + 1] : NULL;
    48604981
    48614982        /* binary search order. */
  • trunk/src/VBox/Devices/Audio/DevHda.h

    r89885 r89887  
    6969/** Pointer to a ring-3 HDA device state.  */
    7070typedef struct HDASTATER3  *PHDASTATER3;
     71/** Pointer to an HDA mixer sink definition (ring-3). */
     72typedef struct HDAMIXERSINK *PHDAMIXERSINK;
    7173
    7274
     
    7476 * The rest of the headers.
    7577 */
    76 #include "DevHdaCommon.h"
    7778#include "DevHdaStream.h"
    7879#include "DevHdaCodec.h"
     80
     81
     82
     83/** @name Stream counts.
     84 *
     85 * At the moment we support 4 input + 4 output streams max, which is 8 in total.
     86 * Bidirectional streams are currently *not* supported.
     87 *
     88 * @note When changing any of those values, be prepared for some saved state
     89 *       fixups / trouble!
     90 * @{
     91 */
     92#define HDA_MAX_SDI                 4
     93#define HDA_MAX_SDO                 4
     94#define HDA_MAX_STREAMS             (HDA_MAX_SDI + HDA_MAX_SDO)
     95/** @} */
     96AssertCompile(HDA_MAX_SDI <= HDA_MAX_SDO);
     97
     98
     99/** Number of general registers. */
     100#define HDA_NUM_GENERAL_REGS        34
     101/** Number of total registers in the HDA's register map. */
     102#define HDA_NUM_REGS                (HDA_NUM_GENERAL_REGS + (HDA_MAX_STREAMS * 10 /* Each stream descriptor has 10 registers */))
     103/** Total number of stream tags (channels). Index 0 is reserved / invalid. */
     104#define HDA_MAX_TAGS                16
     105
     106
     107/** Read callback. */
     108typedef VBOXSTRICTRC FNHDAREGREAD(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
     109/** Write callback. */
     110typedef VBOXSTRICTRC FNHDAREGWRITE(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
     111
     112/**
     113 * HDA register descriptor.
     114 */
     115typedef struct HDAREGDESC
     116{
     117    /** Register offset in the register space. */
     118    uint32_t        offset;
     119    /** Size in bytes. Registers of size > 4 are in fact tables. */
     120    uint32_t        size;
     121    /** Readable bits. */
     122    uint32_t        readable;
     123    /** Writable bits. */
     124    uint32_t        writable;
     125    /** Register descriptor (RD) flags of type HDA_RD_F_XXX. These are used to
     126     *  specify the handling (read/write) policy of the register. */
     127    uint32_t        fFlags;
     128    /** Read callback. */
     129    FNHDAREGREAD   *pfnRead;
     130    /** Write callback. */
     131    FNHDAREGWRITE  *pfnWrite;
     132    /** Index into the register storage array.
     133     * @todo r=bird: Bad structure layout. Move up before pfnRead. */
     134    uint32_t        mem_idx;
     135    /** Abbreviated name. */
     136    const char     *abbrev;
     137    /** Descripton. */
     138    const char     *desc;
     139} HDAREGDESC;
     140
     141extern const HDAREGDESC g_aHdaRegMap[HDA_NUM_REGS];
     142
     143
     144/**
     145 * ICH6 datasheet defines limits for FIFOS registers (18.2.39).
     146 * Formula: size - 1
     147 * Other values not listed are not supported.
     148 */
     149
     150/** Offset of the SD0 register map. */
     151#define HDA_REG_DESC_SD0_BASE       0x80
     152
     153/** Turn a short global register name into an memory index and a stringized name. */
     154#define HDA_REG_IDX(abbrev)         HDA_MEM_IND_NAME(abbrev), #abbrev
     155
     156/** Turns a short stream register name into an memory index and a stringized name. */
     157#define HDA_REG_IDX_STRM(reg, suff) HDA_MEM_IND_NAME(reg ## suff), #reg #suff
     158
     159/** Same as above for a register *not* stored in memory. */
     160#define HDA_REG_IDX_NOMEM(abbrev)   0, #abbrev
     161
     162/*
     163 * NB: Register values stored in memory (au32Regs[]) are indexed through
     164 * the HDA_RMX_xxx macros (also HDA_MEM_IND_NAME()). On the other hand, the
     165 * register descriptors in g_aHdaRegMap[] are indexed through the
     166 * HDA_REG_xxx macros (also HDA_REG_IND_NAME()).
     167 *
     168 * The au32Regs[] layout is kept unchanged for saved state
     169 * compatibility.
     170 */
     171
     172/* Registers */
     173#define HDA_REG_IND_NAME(x)         HDA_REG_##x
     174#define HDA_MEM_IND_NAME(x)         HDA_RMX_##x
     175#define HDA_REG_IND(pThis, x)       ((pThis)->au32Regs[g_aHdaRegMap[x].mem_idx])
     176#define HDA_REG(pThis, x)           (HDA_REG_IND((pThis), HDA_REG_IND_NAME(x)))
     177
     178
     179#define HDA_REG_GCAP                0           /* Range 0x00 - 0x01 */
     180#define HDA_RMX_GCAP                0
     181/**
     182 * GCAP HDASpec 3.3.2 This macro encodes the following information about HDA in a compact manner:
     183 *
     184 * oss (15:12) - Number of output streams supported.
     185 * iss (11:8)  - Number of input streams supported.
     186 * bss (7:3)   - Number of bidirectional streams supported.
     187 * bds (2:1)   - Number of serial data out (SDO) signals supported.
     188 * b64sup (0)  - 64 bit addressing supported.
     189 */
     190#define HDA_MAKE_GCAP(oss, iss, bss, bds, b64sup) \
     191    (  (((oss)   & 0xF)  << 12) \
     192     | (((iss)   & 0xF)  << 8)  \
     193     | (((bss)   & 0x1F) << 3)  \
     194     | (((bds)   & 0x3)  << 2)  \
     195     | ((b64sup) & 1))
     196
     197#define HDA_REG_VMIN                1           /* 0x02 */
     198#define HDA_RMX_VMIN                1
     199
     200#define HDA_REG_VMAJ                2           /* 0x03 */
     201#define HDA_RMX_VMAJ                2
     202
     203#define HDA_REG_OUTPAY              3           /* 0x04-0x05 */
     204#define HDA_RMX_OUTPAY              3
     205
     206#define HDA_REG_INPAY               4           /* 0x06-0x07 */
     207#define HDA_RMX_INPAY               4
     208
     209#define HDA_REG_GCTL                5           /* 0x08-0x0B */
     210#define HDA_RMX_GCTL                5
     211#define HDA_GCTL_UNSOL              RT_BIT(8)   /* Accept Unsolicited Response Enable */
     212#define HDA_GCTL_FCNTRL             RT_BIT(1)   /* Flush Control */
     213#define HDA_GCTL_CRST               RT_BIT(0)   /* Controller Reset */
     214
     215#define HDA_REG_WAKEEN              6           /* 0x0C */
     216#define HDA_RMX_WAKEEN              6
     217
     218#define HDA_REG_STATESTS            7           /* 0x0E */
     219#define HDA_RMX_STATESTS            7
     220#define HDA_STATESTS_SCSF_MASK      0x7         /* State Change Status Flags (6.2.8). */
     221
     222#define HDA_REG_GSTS                8           /* 0x10-0x11*/
     223#define HDA_RMX_GSTS                8
     224#define HDA_GSTS_FSTS               RT_BIT(1)   /* Flush Status */
     225
     226#define HDA_REG_OUTSTRMPAY          9           /* 0x18 */
     227#define HDA_RMX_OUTSTRMPAY          112
     228
     229#define HDA_REG_INSTRMPAY           10          /* 0x1a */
     230#define HDA_RMX_INSTRMPAY           113
     231
     232#define HDA_REG_INTCTL              11          /* 0x20 */
     233#define HDA_RMX_INTCTL              9
     234#define HDA_INTCTL_GIE              RT_BIT(31)  /* Global Interrupt Enable */
     235#define HDA_INTCTL_CIE              RT_BIT(30)  /* Controller Interrupt Enable */
     236/** Bits 0-29 correspond to streams 0-29. */
     237#define HDA_STRMINT_MASK            0xFF        /* Streams 0-7 implemented. Applies to INTCTL and INTSTS. */
     238
     239#define HDA_REG_INTSTS              12          /* 0x24 */
     240#define HDA_RMX_INTSTS              10
     241#define HDA_INTSTS_GIS              RT_BIT(31)  /* Global Interrupt Status */
     242#define HDA_INTSTS_CIS              RT_BIT(30)  /* Controller Interrupt Status */
     243
     244#define HDA_REG_WALCLK              13          /* 0x30 */
     245/**NB: HDA_RMX_WALCLK is not defined because the register is not stored in memory. */
     246
     247/**
     248 * Note: The HDA specification defines a SSYNC register at offset 0x38. The
     249 * ICH6/ICH9 datahseet defines SSYNC at offset 0x34. The Linux HDA driver matches
     250 * the datasheet.
     251 */
     252#define HDA_REG_SSYNC               14          /* 0x34 */
     253#define HDA_RMX_SSYNC               12
     254
     255#define HDA_REG_CORBLBASE           15          /* 0x40 */
     256#define HDA_RMX_CORBLBASE           13
     257
     258#define HDA_REG_CORBUBASE           16          /* 0x44 */
     259#define HDA_RMX_CORBUBASE           14
     260
     261#define HDA_REG_CORBWP              17          /* 0x48 */
     262#define HDA_RMX_CORBWP              15
     263
     264#define HDA_REG_CORBRP              18          /* 0x4A */
     265#define HDA_RMX_CORBRP              16
     266#define HDA_CORBRP_RST              RT_BIT(15)  /* CORB Read Pointer Reset */
     267
     268#define HDA_REG_CORBCTL             19          /* 0x4C */
     269#define HDA_RMX_CORBCTL             17
     270#define HDA_CORBCTL_DMA             RT_BIT(1)   /* Enable CORB DMA Engine */
     271#define HDA_CORBCTL_CMEIE           RT_BIT(0)   /* CORB Memory Error Interrupt Enable */
     272
     273#define HDA_REG_CORBSTS             20          /* 0x4D */
     274#define HDA_RMX_CORBSTS             18
     275
     276#define HDA_REG_CORBSIZE            21          /* 0x4E */
     277#define HDA_RMX_CORBSIZE            19
     278#define HDA_CORBSIZE_SZ_CAP         0xF0
     279#define HDA_CORBSIZE_SZ             0x3
     280
     281/** Number of CORB buffer entries. */
     282#define HDA_CORB_SIZE               256
     283/** CORB element size (in bytes). */
     284#define HDA_CORB_ELEMENT_SIZE       4
     285/** Number of RIRB buffer entries. */
     286#define HDA_RIRB_SIZE               256
     287/** RIRB element size (in bytes). */
     288#define HDA_RIRB_ELEMENT_SIZE       8
     289
     290#define HDA_REG_RIRBLBASE           22          /* 0x50 */
     291#define HDA_RMX_RIRBLBASE           20
     292
     293#define HDA_REG_RIRBUBASE           23          /* 0x54 */
     294#define HDA_RMX_RIRBUBASE           21
     295
     296#define HDA_REG_RIRBWP              24          /* 0x58 */
     297#define HDA_RMX_RIRBWP              22
     298#define HDA_RIRBWP_RST              RT_BIT(15)  /* RIRB Write Pointer Reset */
     299
     300#define HDA_REG_RINTCNT             25          /* 0x5A */
     301#define HDA_RMX_RINTCNT             23
     302
     303/** Maximum number of Response Interrupts. */
     304#define HDA_MAX_RINTCNT             256
     305
     306#define HDA_REG_RIRBCTL             26          /* 0x5C */
     307#define HDA_RMX_RIRBCTL             24
     308#define HDA_RIRBCTL_ROIC            RT_BIT(2)   /* Response Overrun Interrupt Control */
     309#define HDA_RIRBCTL_RDMAEN          RT_BIT(1)   /* RIRB DMA Enable */
     310#define HDA_RIRBCTL_RINTCTL         RT_BIT(0)   /* Response Interrupt Control */
     311
     312#define HDA_REG_RIRBSTS             27          /* 0x5D */
     313#define HDA_RMX_RIRBSTS             25
     314#define HDA_RIRBSTS_RIRBOIS         RT_BIT(2)   /* Response Overrun Interrupt Status */
     315#define HDA_RIRBSTS_RINTFL          RT_BIT(0)   /* Response Interrupt Flag */
     316
     317#define HDA_REG_RIRBSIZE            28          /* 0x5E */
     318#define HDA_RMX_RIRBSIZE            26
     319
     320#define HDA_REG_IC                  29          /* 0x60 */
     321#define HDA_RMX_IC                  27
     322
     323#define HDA_REG_IR                  30          /* 0x64 */
     324#define HDA_RMX_IR                  28
     325
     326#define HDA_REG_IRS                 31          /* 0x68 */
     327#define HDA_RMX_IRS                 29
     328#define HDA_IRS_IRV                 RT_BIT(1)   /* Immediate Result Valid */
     329#define HDA_IRS_ICB                 RT_BIT(0)   /* Immediate Command Busy */
     330
     331#define HDA_REG_DPLBASE             32          /* 0x70 */
     332#define HDA_RMX_DPLBASE             30
     333
     334#define HDA_REG_DPUBASE             33          /* 0x74 */
     335#define HDA_RMX_DPUBASE             31
     336
     337#define DPBASE_ADDR_MASK            (~(uint64_t)0x7f)
     338
     339#define HDA_STREAM_REG_DEF(name, num)           (HDA_REG_SD##num##name)
     340#define HDA_STREAM_RMX_DEF(name, num)           (HDA_RMX_SD##num##name)
     341/** @note sdnum here _MUST_ be stream reg number [0,7]. */
     342#define HDA_STREAM_REG(pThis, name, sdnum)      (HDA_REG_IND((pThis), HDA_REG_SD0##name + (sdnum) * 10))
     343
     344#define HDA_SD_NUM_FROM_REG(pThis, func, reg)   ((reg - HDA_STREAM_REG_DEF(func, 0)) / 10)
     345
     346/** @todo Condense marcos! */
     347
     348#define HDA_REG_SD0CTL              HDA_NUM_GENERAL_REGS /* 0x80; other streams offset by 0x20 */
     349#define HDA_RMX_SD0CTL              32
     350#define HDA_RMX_SD1CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 10)
     351#define HDA_RMX_SD2CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 20)
     352#define HDA_RMX_SD3CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 30)
     353#define HDA_RMX_SD4CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 40)
     354#define HDA_RMX_SD5CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 50)
     355#define HDA_RMX_SD6CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 60)
     356#define HDA_RMX_SD7CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 70)
     357
     358#define HDA_SDCTL_NUM_MASK          0xF
     359#define HDA_SDCTL_NUM_SHIFT         20
     360#define HDA_SDCTL_DIR               RT_BIT(19)  /* Direction (Bidirectional streams only!) */
     361#define HDA_SDCTL_TP                RT_BIT(18)  /* Traffic Priority (PCI Express) */
     362#define HDA_SDCTL_STRIPE_MASK       0x3
     363#define HDA_SDCTL_STRIPE_SHIFT      16
     364#define HDA_SDCTL_DEIE              RT_BIT(4)   /* Descriptor Error Interrupt Enable */
     365#define HDA_SDCTL_FEIE              RT_BIT(3)   /* FIFO Error Interrupt Enable */
     366#define HDA_SDCTL_IOCE              RT_BIT(2)   /* Interrupt On Completion Enable */
     367#define HDA_SDCTL_RUN               RT_BIT(1)   /* Stream Run */
     368#define HDA_SDCTL_SRST              RT_BIT(0)   /* Stream Reset */
     369
     370#define HDA_REG_SD0STS              35          /* 0x83; other streams offset by 0x20 */
     371#define HDA_RMX_SD0STS              33
     372#define HDA_RMX_SD1STS              (HDA_STREAM_RMX_DEF(STS, 0) + 10)
     373#define HDA_RMX_SD2STS              (HDA_STREAM_RMX_DEF(STS, 0) + 20)
     374#define HDA_RMX_SD3STS              (HDA_STREAM_RMX_DEF(STS, 0) + 30)
     375#define HDA_RMX_SD4STS              (HDA_STREAM_RMX_DEF(STS, 0) + 40)
     376#define HDA_RMX_SD5STS              (HDA_STREAM_RMX_DEF(STS, 0) + 50)
     377#define HDA_RMX_SD6STS              (HDA_STREAM_RMX_DEF(STS, 0) + 60)
     378#define HDA_RMX_SD7STS              (HDA_STREAM_RMX_DEF(STS, 0) + 70)
     379
     380#define HDA_SDSTS_FIFORDY           RT_BIT(5)   /* FIFO Ready */
     381#define HDA_SDSTS_DESE              RT_BIT(4)   /* Descriptor Error */
     382#define HDA_SDSTS_FIFOE             RT_BIT(3)   /* FIFO Error */
     383#define HDA_SDSTS_BCIS              RT_BIT(2)   /* Buffer Completion Interrupt Status */
     384
     385#define HDA_REG_SD0LPIB             36          /* 0x84; other streams offset by 0x20 */
     386#define HDA_REG_SD1LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 10) /* 0xA4 */
     387#define HDA_REG_SD2LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 20) /* 0xC4 */
     388#define HDA_REG_SD3LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 30) /* 0xE4 */
     389#define HDA_REG_SD4LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 40) /* 0x104 */
     390#define HDA_REG_SD5LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 50) /* 0x124 */
     391#define HDA_REG_SD6LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 60) /* 0x144 */
     392#define HDA_REG_SD7LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 70) /* 0x164 */
     393#define HDA_RMX_SD0LPIB             34
     394#define HDA_RMX_SD1LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 10)
     395#define HDA_RMX_SD2LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 20)
     396#define HDA_RMX_SD3LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 30)
     397#define HDA_RMX_SD4LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 40)
     398#define HDA_RMX_SD5LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 50)
     399#define HDA_RMX_SD6LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 60)
     400#define HDA_RMX_SD7LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 70)
     401
     402#define HDA_REG_SD0CBL              37          /* 0x88; other streams offset by 0x20 */
     403#define HDA_RMX_SD0CBL              35
     404#define HDA_RMX_SD1CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 10)
     405#define HDA_RMX_SD2CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 20)
     406#define HDA_RMX_SD3CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 30)
     407#define HDA_RMX_SD4CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 40)
     408#define HDA_RMX_SD5CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 50)
     409#define HDA_RMX_SD6CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 60)
     410#define HDA_RMX_SD7CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 70)
     411
     412#define HDA_REG_SD0LVI              38          /* 0x8C; other streams offset by 0x20 */
     413#define HDA_RMX_SD0LVI              36
     414#define HDA_RMX_SD1LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 10)
     415#define HDA_RMX_SD2LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 20)
     416#define HDA_RMX_SD3LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 30)
     417#define HDA_RMX_SD4LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 40)
     418#define HDA_RMX_SD5LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 50)
     419#define HDA_RMX_SD6LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 60)
     420#define HDA_RMX_SD7LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 70)
     421
     422#define HDA_REG_SD0FIFOW            39          /* 0x8E; other streams offset by 0x20 */
     423#define HDA_RMX_SD0FIFOW            37
     424#define HDA_RMX_SD1FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 10)
     425#define HDA_RMX_SD2FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 20)
     426#define HDA_RMX_SD3FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 30)
     427#define HDA_RMX_SD4FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 40)
     428#define HDA_RMX_SD5FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 50)
     429#define HDA_RMX_SD6FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 60)
     430#define HDA_RMX_SD7FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 70)
     431
     432/*
     433 * ICH6 datasheet defined limits for FIFOW values (18.2.38).
     434 */
     435#define HDA_SDFIFOW_8B              0x2
     436#define HDA_SDFIFOW_16B             0x3
     437#define HDA_SDFIFOW_32B             0x4
     438
     439#define HDA_REG_SD0FIFOS            40          /* 0x90; other streams offset by 0x20 */
     440#define HDA_RMX_SD0FIFOS            38
     441#define HDA_RMX_SD1FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 10)
     442#define HDA_RMX_SD2FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 20)
     443#define HDA_RMX_SD3FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 30)
     444#define HDA_RMX_SD4FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 40)
     445#define HDA_RMX_SD5FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 50)
     446#define HDA_RMX_SD6FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 60)
     447#define HDA_RMX_SD7FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 70)
     448
     449#define HDA_SDIFIFO_120B            0x77        /* 8-, 16-, 20-, 24-, 32-bit Input Streams */
     450#define HDA_SDIFIFO_160B            0x9F        /* 20-, 24-bit Input Streams Streams */
     451
     452#define HDA_SDOFIFO_16B             0x0F        /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     453#define HDA_SDOFIFO_32B             0x1F        /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     454#define HDA_SDOFIFO_64B             0x3F        /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     455#define HDA_SDOFIFO_128B            0x7F        /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     456#define HDA_SDOFIFO_192B            0xBF        /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     457#define HDA_SDOFIFO_256B            0xFF        /* 20-, 24-bit Output Streams */
     458
     459#define HDA_REG_SD0FMT              41          /* 0x92; other streams offset by 0x20 */
     460#define HDA_RMX_SD0FMT              39
     461#define HDA_RMX_SD1FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 10)
     462#define HDA_RMX_SD2FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 20)
     463#define HDA_RMX_SD3FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 30)
     464#define HDA_RMX_SD4FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 40)
     465#define HDA_RMX_SD5FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 50)
     466#define HDA_RMX_SD6FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 60)
     467#define HDA_RMX_SD7FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 70)
     468
     469#define HDA_REG_SD0BDPL             42          /* 0x98; other streams offset by 0x20 */
     470#define HDA_RMX_SD0BDPL             40
     471#define HDA_RMX_SD1BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 10)
     472#define HDA_RMX_SD2BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 20)
     473#define HDA_RMX_SD3BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 30)
     474#define HDA_RMX_SD4BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 40)
     475#define HDA_RMX_SD5BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 50)
     476#define HDA_RMX_SD6BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 60)
     477#define HDA_RMX_SD7BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 70)
     478
     479#define HDA_REG_SD0BDPU             43          /* 0x9C; other streams offset by 0x20 */
     480#define HDA_RMX_SD0BDPU             41
     481#define HDA_RMX_SD1BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 10)
     482#define HDA_RMX_SD2BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 20)
     483#define HDA_RMX_SD3BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 30)
     484#define HDA_RMX_SD4BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 40)
     485#define HDA_RMX_SD5BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 50)
     486#define HDA_RMX_SD6BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 60)
     487#define HDA_RMX_SD7BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 70)
     488
     489#define HDA_CODEC_CAD_SHIFT         28
     490/** Encodes the (required) LUN into a codec command. */
     491#define HDA_CODEC_CMD(cmd, lun)     ((cmd) | (lun << HDA_CODEC_CAD_SHIFT))
     492
     493#define HDA_SDFMT_NON_PCM_SHIFT     15
     494#define HDA_SDFMT_NON_PCM_MASK      0x1
     495#define HDA_SDFMT_BASE_RATE_SHIFT   14
     496#define HDA_SDFMT_BASE_RATE_MASK    0x1
     497#define HDA_SDFMT_MULT_SHIFT        11
     498#define HDA_SDFMT_MULT_MASK         0x7
     499#define HDA_SDFMT_DIV_SHIFT         8
     500#define HDA_SDFMT_DIV_MASK          0x7
     501#define HDA_SDFMT_BITS_SHIFT        4
     502#define HDA_SDFMT_BITS_MASK         0x7
     503#define HDA_SDFMT_CHANNELS_MASK     0xF
     504
     505#define HDA_SDFMT_TYPE              RT_BIT(15)
     506#define HDA_SDFMT_TYPE_PCM          (0)
     507#define HDA_SDFMT_TYPE_NON_PCM      (1)
     508
     509#define HDA_SDFMT_BASE              RT_BIT(14)
     510#define HDA_SDFMT_BASE_48KHZ        (0)
     511#define HDA_SDFMT_BASE_44KHZ        (1)
     512
     513#define HDA_SDFMT_MULT_1X           (0)
     514#define HDA_SDFMT_MULT_2X           (1)
     515#define HDA_SDFMT_MULT_3X           (2)
     516#define HDA_SDFMT_MULT_4X           (3)
     517
     518#define HDA_SDFMT_DIV_1X            (0)
     519#define HDA_SDFMT_DIV_2X            (1)
     520#define HDA_SDFMT_DIV_3X            (2)
     521#define HDA_SDFMT_DIV_4X            (3)
     522#define HDA_SDFMT_DIV_5X            (4)
     523#define HDA_SDFMT_DIV_6X            (5)
     524#define HDA_SDFMT_DIV_7X            (6)
     525#define HDA_SDFMT_DIV_8X            (7)
     526
     527#define HDA_SDFMT_8_BIT             (0)
     528#define HDA_SDFMT_16_BIT            (1)
     529#define HDA_SDFMT_20_BIT            (2)
     530#define HDA_SDFMT_24_BIT            (3)
     531#define HDA_SDFMT_32_BIT            (4)
     532
     533#define HDA_SDFMT_CHAN_MONO         (0)
     534#define HDA_SDFMT_CHAN_STEREO       (1)
     535
     536/** Emits a SDnFMT register format.
     537 * Also being used in the codec's converter format. */
     538#define HDA_SDFMT_MAKE(_afNonPCM, _aBaseRate, _aMult, _aDiv, _aBits, _aChan)    \
     539    (  (((_afNonPCM)  & HDA_SDFMT_NON_PCM_MASK)   << HDA_SDFMT_NON_PCM_SHIFT)   \
     540     | (((_aBaseRate) & HDA_SDFMT_BASE_RATE_MASK) << HDA_SDFMT_BASE_RATE_SHIFT) \
     541     | (((_aMult)     & HDA_SDFMT_MULT_MASK)      << HDA_SDFMT_MULT_SHIFT)      \
     542     | (((_aDiv)      & HDA_SDFMT_DIV_MASK)       << HDA_SDFMT_DIV_SHIFT)       \
     543     | (((_aBits)     & HDA_SDFMT_BITS_MASK)      << HDA_SDFMT_BITS_SHIFT)      \
     544     | ( (_aChan)     & HDA_SDFMT_CHANNELS_MASK))
     545
     546/** Interrupt on completion (IOC) flag. */
     547#define HDA_BDLE_F_IOC              RT_BIT(0)
     548
     549
     550/**
     551 * BDL description structure.
     552 * Do not touch this, as this must match to the HDA specs.
     553 */
     554typedef struct HDABDLEDESC
     555{
     556    /** Starting address of the actual buffer. Must be 128-bit aligned. */
     557    uint64_t     u64BufAddr;
     558    /** Size of the actual buffer (in bytes). */
     559    uint32_t     u32BufSize;
     560    /** Bit 0: Interrupt on completion; the controller will generate
     561     *  an interrupt when the last byte of the buffer has been
     562     *  fetched by the DMA engine.
     563     *
     564     *  Rest is reserved for further use and must be 0. */
     565    uint32_t     fFlags;
     566} HDABDLEDESC, *PHDABDLEDESC;
     567AssertCompileSize(HDABDLEDESC, 16); /* Always 16 byte. Also must be aligned on 128-byte boundary. */
     568
    79569
    80570
     
    98588    R3PTRTYPE(PAUDMIXSINK)  pMixSink;
    99589} HDAMIXERSINK;
    100 /** Pointer to an HDA mixer sink definition (ring-3). */
    101 typedef HDAMIXERSINK *PHDAMIXERSINK;
    102590
    103591/**
     
    303791typedef CTX_SUFF(PHDASTATE) PHDASTATECC;
    304792
     793
     794/** @def HDA_PROCESS_INTERRUPT
     795 * Wrapper around hdaProcessInterrupt that supplies the source function name
     796 * string in logging builds. */
     797#if defined(LOG_ENABLED) || defined(DOXYGEN_RUNNING)
     798void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis, const char *pszSource);
     799# define HDA_PROCESS_INTERRUPT(a_pDevIns, a_pThis)  hdaProcessInterrupt((a_pDevIns), (a_pThis), __FUNCTION__)
     800#else
     801void hdaProcessInterrupt(PPDMDEVINS pDevIns, PHDASTATE pThis);
     802# define HDA_PROCESS_INTERRUPT(a_pDevIns, a_pThis)  hdaProcessInterrupt((a_pDevIns), (a_pThis))
     803#endif
     804
     805/**
     806 * Returns the audio direction of a specified stream descriptor.
     807 *
     808 * The register layout specifies that input streams (SDI) come first,
     809 * followed by the output streams (SDO). So every stream ID below HDA_MAX_SDI
     810 * is an input stream, whereas everything >= HDA_MAX_SDI is an output stream.
     811 *
     812 * @note SDnFMT register does not provide that information, so we have to judge
     813 *       for ourselves.
     814 *
     815 * @return  Audio direction.
     816 * @param   uSD     The stream number.
     817 */
     818DECLINLINE(PDMAUDIODIR) hdaGetDirFromSD(uint8_t uSD)
     819{
     820    if (uSD < HDA_MAX_SDI)
     821        return PDMAUDIODIR_IN;
     822    AssertReturn(uSD < HDA_MAX_STREAMS, PDMAUDIODIR_UNKNOWN);
     823    return PDMAUDIODIR_OUT;
     824}
     825
     826/* Used by hdaR3StreamSetUp: */
     827uint8_t hdaSDFIFOWToBytes(uint16_t u16RegFIFOW);
     828
    305829#endif /* !VBOX_INCLUDED_SRC_Audio_DevHda_h */
    306830
  • trunk/src/VBox/Devices/Audio/DevHdaCodec.cpp

    r89869 r89887  
    4141#include "AudioMixer.h"
    4242#include "DevHda.h"
    43 #include "DevHdaCodec.h"
    44 #include "DevHdaCommon.h"
    4543
    4644
  • trunk/src/VBox/Devices/Audio/DevHdaStream.cpp

    r89885 r89887  
    206206    LogFlowFuncLeave();
    207207}
     208
     209
     210/**
     211 * Converts an HDA stream's SDFMT register into a given PCM properties structure.
     212 *
     213 * @returns VBox status code.
     214 * @param   u16SDFMT            The HDA stream's SDFMT value to convert.
     215 * @param   pProps              PCM properties structure to hold converted result on success.
     216 */
     217int hdaR3SDFMTToPCMProps(uint16_t u16SDFMT, PPDMAUDIOPCMPROPS pProps)
     218{
     219    AssertPtrReturn(pProps, VERR_INVALID_POINTER);
     220
     221# define EXTRACT_VALUE(v, mask, shift) ((v & ((mask) << (shift))) >> (shift))
     222
     223    int rc = VINF_SUCCESS;
     224
     225    uint32_t u32Hz     = EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_BASE_RATE_MASK, HDA_SDFMT_BASE_RATE_SHIFT)
     226                       ? 44100 : 48000;
     227    uint32_t u32HzMult = 1;
     228    uint32_t u32HzDiv  = 1;
     229
     230    switch (EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_MULT_MASK, HDA_SDFMT_MULT_SHIFT))
     231    {
     232        case 0: u32HzMult = 1; break;
     233        case 1: u32HzMult = 2; break;
     234        case 2: u32HzMult = 3; break;
     235        case 3: u32HzMult = 4; break;
     236        default:
     237            LogFunc(("Unsupported multiplier %x\n",
     238                     EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_MULT_MASK, HDA_SDFMT_MULT_SHIFT)));
     239            rc = VERR_NOT_SUPPORTED;
     240            break;
     241    }
     242    switch (EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_DIV_MASK, HDA_SDFMT_DIV_SHIFT))
     243    {
     244        case 0: u32HzDiv = 1; break;
     245        case 1: u32HzDiv = 2; break;
     246        case 2: u32HzDiv = 3; break;
     247        case 3: u32HzDiv = 4; break;
     248        case 4: u32HzDiv = 5; break;
     249        case 5: u32HzDiv = 6; break;
     250        case 6: u32HzDiv = 7; break;
     251        case 7: u32HzDiv = 8; break;
     252        default:
     253            LogFunc(("Unsupported divisor %x\n",
     254                     EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_DIV_MASK, HDA_SDFMT_DIV_SHIFT)));
     255            rc = VERR_NOT_SUPPORTED;
     256            break;
     257    }
     258
     259    uint8_t cbSample = 0;
     260    switch (EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_BITS_MASK, HDA_SDFMT_BITS_SHIFT))
     261    {
     262        case 0:
     263            cbSample = 1;
     264            break;
     265        case 1:
     266            cbSample = 2;
     267            break;
     268        case 4:
     269            cbSample = 4;
     270            break;
     271        default:
     272            AssertMsgFailed(("Unsupported bits per sample %x\n",
     273                             EXTRACT_VALUE(u16SDFMT, HDA_SDFMT_BITS_MASK, HDA_SDFMT_BITS_SHIFT)));
     274            rc = VERR_NOT_SUPPORTED;
     275            break;
     276    }
     277
     278    if (RT_SUCCESS(rc))
     279    {
     280        PDMAudioPropsInit(pProps, cbSample, true /*fSigned*/, (u16SDFMT & 0xf) + 1 /*cChannels*/, u32Hz * u32HzMult / u32HzDiv);
     281        /** @todo is there anything we need to / can do about channel assignments? */
     282    }
     283
     284# undef EXTRACT_VALUE
     285    return rc;
     286}
     287
     288# ifdef LOG_ENABLED
     289void hdaR3BDLEDumpAll(PPDMDEVINS pDevIns, PHDASTATE pThis, uint64_t u64BDLBase, uint16_t cBDLE)
     290{
     291    LogFlowFunc(("BDLEs @ 0x%x (%RU16):\n", u64BDLBase, cBDLE));
     292    if (!u64BDLBase)
     293        return;
     294
     295    uint32_t cbBDLE = 0;
     296    for (uint16_t i = 0; i < cBDLE; i++)
     297    {
     298        HDABDLEDESC bd;
     299        PDMDevHlpPhysRead(pDevIns, u64BDLBase + i * sizeof(HDABDLEDESC), &bd, sizeof(bd));
     300
     301        LogFunc(("\t#%03d BDLE(adr:0x%llx, size:%RU32, ioc:%RTbool)\n",
     302                 i, bd.u64BufAddr, bd.u32BufSize, bd.fFlags & HDA_BDLE_F_IOC));
     303
     304        cbBDLE += bd.u32BufSize;
     305    }
     306
     307    LogFlowFunc(("Total: %RU32 bytes\n", cbBDLE));
     308
     309    if (!pThis->u64DPBase) /* No DMA base given? Bail out. */
     310        return;
     311
     312    LogFlowFunc(("DMA counters:\n"));
     313
     314    for (int i = 0; i < cBDLE; i++)
     315    {
     316        uint32_t uDMACnt;
     317        PDMDevHlpPhysRead(pDevIns, (pThis->u64DPBase & DPBASE_ADDR_MASK) + (i * 2 * sizeof(uint32_t)),
     318                          &uDMACnt, sizeof(uDMACnt));
     319
     320        LogFlowFunc(("\t#%03d DMA @ 0x%x\n", i , uDMACnt));
     321    }
     322}
     323# endif /* LOG_ENABLED */
    208324
    209325
     
    793909    return rc;
    794910}
     911
     912
     913/**
     914 * Worker for hdaR3StreamReset().
     915 *
     916 * @returns The default mixer sink, NULL if none found.
     917 * @param   pThisCC             The ring-3 HDA device state.
     918 * @param   uSD                 SD# to return mixer sink for.
     919 *                              NULL if not found / handled.
     920 */
     921static PHDAMIXERSINK hdaR3GetDefaultSink(PHDASTATER3 pThisCC, uint8_t uSD)
     922{
     923    if (hdaGetDirFromSD(uSD) == PDMAUDIODIR_IN)
     924    {
     925        const uint8_t uFirstSDI = 0;
     926
     927        if (uSD == uFirstSDI) /* First SDI. */
     928            return &pThisCC->SinkLineIn;
     929# ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
     930        if (uSD == uFirstSDI + 1)
     931            return &pThisCC->SinkMicIn;
     932# else
     933        /* If we don't have a dedicated Mic-In sink, use the always present Line-In sink. */
     934        return &pThisCC->SinkLineIn;
     935# endif
     936    }
     937    else
     938    {
     939        const uint8_t uFirstSDO = HDA_MAX_SDI;
     940
     941        if (uSD == uFirstSDO)
     942            return &pThisCC->SinkFront;
     943# ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
     944        if (uSD == uFirstSDO + 1)
     945            return &pThisCC->SinkCenterLFE;
     946        if (uSD == uFirstSDO + 2)
     947            return &pThisCC->SinkRear;
     948# endif
     949    }
     950
     951    return NULL;
     952}
     953
    795954
    796955/**
  • trunk/src/VBox/Devices/Audio/DevHdaStream.h

    r89885 r89887  
    337337/** @} */
    338338
     339/** @name Helper functions associated with the stream code.
     340 * @{ */
     341int                 hdaR3SDFMTToPCMProps(uint16_t u16SDFMT, PPDMAUDIOPCMPROPS pProps);
     342# ifdef LOG_ENABLED
     343void                hdaR3BDLEDumpAll(PPDMDEVINS pDevIns, PHDASTATE pThis, uint64_t u64BDLBase, uint16_t cBDLE);
     344# endif
     345/** @} */
     346
    339347#endif /* IN_RING3 */
    340348#endif /* !VBOX_INCLUDED_SRC_Audio_DevHdaStream_h */
  • trunk/src/VBox/Devices/Makefile.kmk

    r89414 r89887  
    638638        Audio/DevSB16.cpp \
    639639        Audio/DevHda.cpp \
    640         Audio/DevHdaCommon.cpp \
    641640        Audio/DevHdaCodec.cpp \
    642641        Audio/DevHdaStream.cpp \
     
    10051004  VBoxDDRC_SOURCES      += \
    10061005        Audio/DevHda.cpp \
    1007         Audio/DevHdaCommon.cpp \
    10081006        Audio/DevIchAc97.cpp
    10091007
     
    12351233 VBoxDDR0_SOURCES += \
    12361234        Audio/DevHda.cpp \
    1237         Audio/DevHdaCommon.cpp \
    12381235        Audio/DevHdaStream.cpp \
    12391236        Audio/DevIchAc97.cpp
Note: See TracChangeset for help on using the changeset viewer.

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