VirtualBox

Changeset 90158 in vbox


Ignore:
Timestamp:
Jul 12, 2021 1:49:57 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
145661
Message:

DevHda: Added the minimum of registers linux accesses for the 8086:9d70 device. The result sounds pretty decent, maybe luck or maybe because of SDnDPIB registers used for getting stream position. Recording not tested. bugref:9890

Location:
trunk/src/VBox/Devices/Audio
Files:
2 edited

Legend:

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

    r90149 r90158  
    285285static FNHDAREGREAD  hdaRegReadWALCLK;
    286286static FNHDAREGWRITE hdaRegWriteSSYNC;
     287static FNHDAREGWRITE hdaRegWriteNewSSYNC;
    287288static FNHDAREGWRITE hdaRegWriteCORBWP;
    288289static FNHDAREGWRITE hdaRegWriteCORBRP;
     
    299300/** @} */
    300301
    301 /** @name {IOB}SDn write functions.
     302/** @name {IOB}SDn read/write functions.
    302303 * @{
    303304 */
     
    311312static FNHDAREGWRITE hdaRegWriteSDBDPL;
    312313static FNHDAREGWRITE hdaRegWriteSDBDPU;
     314static FNHDAREGREAD  hdaRegReadSDnPIB;
     315static FNHDAREGREAD  hdaRegReadSDnEFIFOS;
    313316/** @} */
    314317
     
    410413    HDA_REG_MAP_STRM(HDA_REG_DESC_SD0_BASE + (index * 32 /* 0x20 */), name)
    411414
     415/** Skylake stream registers. */
     416#define HDA_REG_MAP_SKYLAKE_STRM(a_off, a_StrPrefix) \
     417                   /* offset        size     read mask   write mask  flags          read callback        write callback     index, abbrev, description */ \
     418                   /* -------       -------  ----------  ----------  -------------- --------------       -----------------  -----------------------------  ----------- */ \
     419    /* 0x1084 */ \
     420    HDA_REG_ENTRY_STR(a_off + 0x04, 0x00004, 0xffffffff, 0x00000000, HDA_RD_F_NONE, hdaRegReadSDnPIB,    hdaRegWriteUnimpl, a_StrPrefix, DPIB,   "DMA Position In Buffer" ), \
     421    /* 0x1094 */ \
     422    HDA_REG_ENTRY_STR(a_off + 0x14, 0x00004, 0xffffffff, 0x00000000, HDA_RD_F_NONE, hdaRegReadSDnEFIFOS, hdaRegWriteUnimpl, a_StrPrefix, EFIFOS, "Extended FIFO Size" )
     423
     424
    412425/** See 302349 p 6.2. */
    413426static const HDAREGDESC g_aHdaRegMap[HDA_NUM_REGS] =
     
    424437    HDA_REG_ENTRY(0x0000e, 0x00002, 0x00000007, 0x00000007, HDA_RD_F_NONE, hdaRegReadU8    , hdaRegWriteSTATESTS, STATESTS,    "State Change Status" ),
    425438    HDA_REG_ENTRY(0x00010, 0x00002, 0xFFFFFFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadUnimpl, hdaRegWriteUnimpl  , GSTS,        "Global Status" ),
     439    HDA_REG_ENTRY(0x00014, 0x00002, 0xFFFFFFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadU16   , hdaRegWriteUnimpl  , LLCH,        "Linked List Capabilities Header" ),
    426440    HDA_REG_ENTRY(0x00018, 0x00002, 0x0000FFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadU16   , hdaRegWriteU16     , OUTSTRMPAY,  "Output Stream Payload Capability" ),
    427441    HDA_REG_ENTRY(0x0001A, 0x00002, 0x0000FFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadU16   , hdaRegWriteUnimpl  , INSTRMPAY,   "Input Stream Payload Capability" ),
     
    429443    HDA_REG_ENTRY(0x00024, 0x00004, 0xC00000FF, 0x00000000, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteUnimpl  , INTSTS,      "Interrupt Status" ),
    430444 HDA_REG_ENTRY_EX(0x00030, 0x00004, 0xFFFFFFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadWALCLK, hdaRegWriteUnimpl  , 0, "WALCLK", "Wall Clock Counter" ),
    431     HDA_REG_ENTRY(0x00034, 0x00004, 0x000000FF, 0x000000FF, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteSSYNC   , SSYNC,       "Stream Synchronization" ),
     445    HDA_REG_ENTRY(0x00034, 0x00004, 0x000000FF, 0x000000FF, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteSSYNC   , SSYNC,       "Stream Synchronization (old)" ),
     446    HDA_REG_ENTRY(0x00038, 0x00004, 0x000000FF, 0x000000FF, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteNewSSYNC, SSYNC,       "Stream Synchronization (new)" ),
    432447    HDA_REG_ENTRY(0x00040, 0x00004, 0xFFFFFF80, 0xFFFFFF80, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteBase    , CORBLBASE,   "CORB Lower Base Address" ),
    433448    HDA_REG_ENTRY(0x00044, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteBase    , CORBUBASE,   "CORB Upper Base Address" ),
     
    458473    HDA_REG_MAP_DEF_STREAM(5, SD5),
    459474    HDA_REG_MAP_DEF_STREAM(6, SD6),
    460     HDA_REG_MAP_DEF_STREAM(7, SD7)
     475    HDA_REG_MAP_DEF_STREAM(7, SD7),
     476    HDA_REG_ENTRY(0x00c00, 0x00004, 0xFFFFFFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteUnimpl  , MLCH,        "Multiple Links Capability Header" ),
     477    HDA_REG_ENTRY(0x00c04, 0x00004, 0xFFFFFFFF, 0x00000000, HDA_RD_F_NONE, hdaRegReadU32   , hdaRegWriteUnimpl  , MLCD,        "Multiple Links Capability Declaration" ),
     478    HDA_REG_MAP_SKYLAKE_STRM(0x01080, SD0),
     479    HDA_REG_MAP_SKYLAKE_STRM(0x010a0, SD1),
     480    HDA_REG_MAP_SKYLAKE_STRM(0x010c0, SD2),
     481    HDA_REG_MAP_SKYLAKE_STRM(0x010e0, SD3),
     482    HDA_REG_MAP_SKYLAKE_STRM(0x01100, SD4),
     483    HDA_REG_MAP_SKYLAKE_STRM(0x01120, SD5),
     484    HDA_REG_MAP_SKYLAKE_STRM(0x01140, SD6),
     485    HDA_REG_MAP_SKYLAKE_STRM(0x01160, SD7),
    461486};
    462487
     
    470495 * HDA register aliases (HDA spec 3.3.45).
    471496 * @remarks Sorted by offReg.
     497 * @remarks Lookup code ASSUMES this starts somewhere after g_aHdaRegMap ends.
    472498 */
    473499static struct HDAREGALIAS
     
    721747        if (offReg < g_aHdaRegMap[idxMiddle].off)
    722748        {
    723             if (idxLow == idxMiddle)
     749            if (idxLow != idxMiddle)
     750                idxEnd = idxMiddle;
     751            else
    724752                break;
    725             idxEnd = idxMiddle;
    726753        }
    727754        else if (offReg > g_aHdaRegMap[idxMiddle].off)
    728755        {
    729756            idxLow = idxMiddle + 1;
    730             if (idxLow >= idxEnd)
     757            if (idxLow < idxEnd)
     758            { /* likely */ }
     759            else
    731760                break;
    732761        }
     
    13431372}
    13441373
    1345 static VBOXSTRICTRC hdaRegWriteSSYNC(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    1346 {
     1374static VBOXSTRICTRC hdaRegWriteSSYNCWorker(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value, const char *pszCaller)
     1375{
     1376    RT_NOREF(pszCaller);
     1377
    13471378    /*
    13481379     * The SSYNC register is a DMA pause mask where each bit represents a stream.
     
    13631394    {
    13641395#if 0 /** @todo implement SSYNC: ndef IN_RING3 */
    1365         RT_NOREF(pDevIns);
    1366         Log3Func(("Going to ring-3 to handle SSYNC change: %#x\n", fChanged));
     1396        Log3(("%s: Going to ring-3 to handle SSYNC change: %#x\n", pszCaller, fChanged));
    13671397        return VINF_IOM_R3_MMIO_WRITE;
    13681398#else
     
    13721402            else if (fNew & fMask)
    13731403            {
    1374                 Log3Func(("SSYNC bit %u set\n", i));
     1404                Log3(("%Rfn: SSYNC bit %u set\n", pszCaller, i));
    13751405                /* See code in SDCTL around hdaR3StreamTimerMain call. */
    13761406            }
    13771407            else
    13781408            {
    1379                 Log3Func(("SSYNC bit %u cleared\n", i));
     1409                Log3(("%Rfn: SSYNC bit %u cleared\n", pszCaller, i));
    13801410                /* The next DMA timer callout will not do anything. */
    13811411            }
    1382         RT_NOREF(pDevIns);
    13831412#endif
    13841413    }
     
    13861415    HDA_REG(pThis, SSYNC) = fNew;
    13871416    return VINF_SUCCESS;
     1417}
     1418
     1419static VBOXSTRICTRC hdaRegWriteSSYNC(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
     1420{
     1421    RT_NOREF(pDevIns);
     1422    return hdaRegWriteSSYNCWorker(pThis, iReg, u32Value, __FUNCTION__);
     1423}
     1424
     1425static VBOXSTRICTRC hdaRegWriteNewSSYNC(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
     1426{
     1427    RT_NOREF(pDevIns);
     1428    return hdaRegWriteSSYNCWorker(pThis, iReg, u32Value, __FUNCTION__);
    13881429}
    13891430
     
    21292170    return hdaRegWriteSDBDPX(pDevIns, pThis, iReg, u32Value, HDA_SD_NUM_FROM_REG(pThis, BDPU, iReg));
    21302171}
     2172
     2173/** Skylake specific. */
     2174static VBOXSTRICTRC hdaRegReadSDnPIB(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
     2175{
     2176    uint8_t const uSD = HDA_SD_NUM_FROM_SKYLAKE_REG(DPIB, iReg);
     2177    LogFlowFunc(("uSD=%u -> SDnLPIB\n", uSD));
     2178    return hdaRegReadLPIB(pDevIns, pThis, HDA_SD_TO_REG(LPIB, uSD), pu32Value);
     2179}
     2180
     2181/** Skylake specific. */
     2182static VBOXSTRICTRC hdaRegReadSDnEFIFOS(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
     2183{
     2184    /** @todo This is not implemented as I have found no specs yet.  */
     2185    RT_NOREF(pDevIns, pThis, iReg);
     2186    LogFunc(("TODO - need register spec: uSD=%u\n", HDA_SD_NUM_FROM_SKYLAKE_REG(DPIB, iReg)));
     2187    *pu32Value = 256;
     2188    return VINF_SUCCESS;
     2189}
     2190
    21312191
    21322192static VBOXSTRICTRC hdaRegReadIRS(PPDMDEVINS pDevIns, PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
     
    29202980     * RIRB response -- so initialize RINTCNT to 1 by default. */
    29212981    HDA_REG(pThis, RINTCNT)  = 0x1;
     2982    /* For newer devices, there is a capability list offset word at 0x14, linux read it, does
     2983       no checking and simply reads the dword it specifies.  The list terminates when the lower
     2984       16 bits are zero.  See snd_hdac_bus_parse_capabilities.  Table 5-2 in intel 341081-002
     2985       specifies this to be 0xc00 and chaining with 0x800, 0x500 and 0x1f00. We just terminate
     2986       it at 0xc00 for now. */
     2987    HDA_REG(pThis, LLCH)     = 0xc00;
     2988    HDA_REG(pThis, MLCH)     = 0x0;
     2989    HDA_REG(pThis, MLCD)     = 0x0;
    29222990
    29232991    /*
     
    51445212                         ("[%#x] = {%#x LB %#x}\n", i, pReg->off, pReg->cb));
    51455213    }
    5146 
     5214    Assert(strcmp(g_aHdaRegMap[HDA_REG_SSYNC].pszName, "SSYNC") == 0);
     5215    Assert(strcmp(g_aHdaRegMap[HDA_REG_DPUBASE].pszName, "DPUBASE") == 0);
     5216    Assert(strcmp(g_aHdaRegMap[HDA_REG_MLCH].pszName, "MLCH") == 0);
     5217    Assert(strcmp(g_aHdaRegMap[HDA_REG_SD3DPIB].pszName, "SD3DPIB") == 0);
     5218    Assert(strcmp(g_aHdaRegMap[HDA_REG_SD7EFIFOS].pszName, "SD7EFIFOS") == 0);
     5219
     5220    /*
     5221     * Register statistics.
     5222     */
    51475223# ifdef VBOX_WITH_STATISTICS
    5148     /*
    5149      * Register statistics.
    5150      */
    51515224    PDMDevHlpSTAMRegister(pDevIns, &pThis->StatIn,               STAMTYPE_PROFILE, "Input",             STAMUNIT_TICKS_PER_CALL, "Profiling input.");
    51525225    PDMDevHlpSTAMRegister(pDevIns, &pThis->StatOut,              STAMTYPE_PROFILE, "Output",            STAMUNIT_TICKS_PER_CALL, "Profiling output.");
  • trunk/src/VBox/Devices/Audio/DevHda.h

    r90140 r90158  
    111111
    112112/** Number of general registers. */
    113 #define HDA_NUM_GENERAL_REGS        34
     113#define HDA_NUM_GENERAL_REGS        36
     114/** Number of stream registers (10 registers per stream). */
     115#define HDA_NUM_STREAM_REGS         (HDA_MAX_STREAMS * 10 /* Each stream descriptor has 10 registers */)
     116/** Number of register after the stream registers. */
     117#define HDA_NUM_POST_STREAM_REGS    (2 + HDA_MAX_STREAMS * 2)
    114118/** Number of total registers in the HDA's register map. */
    115 #define HDA_NUM_REGS                (HDA_NUM_GENERAL_REGS + (HDA_MAX_STREAMS * 10 /* Each stream descriptor has 10 registers */))
     119#define HDA_NUM_REGS                (HDA_NUM_GENERAL_REGS + HDA_NUM_STREAM_REGS + HDA_NUM_POST_STREAM_REGS)
    116120/** Total number of stream tags (channels). Index 0 is reserved / invalid. */
    117121#define HDA_MAX_TAGS                16
     
    186190#define HDA_GSTS_FSTS               RT_BIT(1)   /* Flush Status */
    187191
    188 #define HDA_REG_OUTSTRMPAY          9           /* 0x18 */
     192#define HDA_REG_LLCH                9           /* 0x14 */
     193#define HDA_RMX_LLCH                114
     194
     195#define HDA_REG_OUTSTRMPAY          10           /* 0x18 */
    189196#define HDA_RMX_OUTSTRMPAY          112
    190197
    191 #define HDA_REG_INSTRMPAY           10          /* 0x1a */
     198#define HDA_REG_INSTRMPAY           11          /* 0x1a */
    192199#define HDA_RMX_INSTRMPAY           113
    193200
    194 #define HDA_REG_INTCTL              11          /* 0x20 */
     201#define HDA_REG_INTCTL              12          /* 0x20 */
    195202#define HDA_RMX_INTCTL              9
    196203#define HDA_INTCTL_GIE              RT_BIT(31)  /* Global Interrupt Enable */
     
    199206#define HDA_STRMINT_MASK            0xFF        /* Streams 0-7 implemented. Applies to INTCTL and INTSTS. */
    200207
    201 #define HDA_REG_INTSTS              12          /* 0x24 */
     208#define HDA_REG_INTSTS              13          /* 0x24 */
    202209#define HDA_RMX_INTSTS              10
    203210#define HDA_INTSTS_GIS              RT_BIT(31)  /* Global Interrupt Status */
    204211#define HDA_INTSTS_CIS              RT_BIT(30)  /* Controller Interrupt Status */
    205212
    206 #define HDA_REG_WALCLK              13          /* 0x30 */
    207 /**NB: HDA_RMX_WALCLK is not defined because the register is not stored in memory. */
     213#define HDA_REG_WALCLK              14          /* 0x30 */
     214/* NB: HDA_RMX_WALCLK is not defined because the register is not stored in memory. */
    208215
    209216/**
    210  * Note: The HDA specification defines a SSYNC register at offset 0x38. The
    211  * ICH6/ICH9 datahseet defines SSYNC at offset 0x34. The Linux HDA driver matches
    212  * the datasheet.
    213  */
    214 #define HDA_REG_SSYNC               14          /* 0x34 */
     217 * @note The HDA specification defines a SSYNC register at offset 0x38.  The ICH6/ICH9
     218 *       datahseet defines SSYNC at offset 0x34.  The Linux HDA driver matches the datasheet.
     219 *       See also https://mailman.alsa-project.org/pipermail/alsa-devel/2011-March/037819.html
     220 */
     221#define HDA_REG_SSYNC               15          /* 0x34 */
    215222#define HDA_RMX_SSYNC               12
    216223
    217 #define HDA_REG_CORBLBASE           15          /* 0x40 */
     224#define HDA_REG_NEW_SSYNC           16          /* 0x38 */
     225#define HDA_RMX_NEW_SSYNC           HDA_RMX_SSYNC
     226
     227#define HDA_REG_CORBLBASE           17          /* 0x40 */
    218228#define HDA_RMX_CORBLBASE           13
    219229
    220 #define HDA_REG_CORBUBASE           16          /* 0x44 */
     230#define HDA_REG_CORBUBASE           18          /* 0x44 */
    221231#define HDA_RMX_CORBUBASE           14
    222232
    223 #define HDA_REG_CORBWP              17          /* 0x48 */
     233#define HDA_REG_CORBWP              19          /* 0x48 */
    224234#define HDA_RMX_CORBWP              15
    225235
    226 #define HDA_REG_CORBRP              18          /* 0x4A */
     236#define HDA_REG_CORBRP              20          /* 0x4A */
    227237#define HDA_RMX_CORBRP              16
    228238#define HDA_CORBRP_RST              RT_BIT(15)  /* CORB Read Pointer Reset */
    229239
    230 #define HDA_REG_CORBCTL             19          /* 0x4C */
     240#define HDA_REG_CORBCTL             21          /* 0x4C */
    231241#define HDA_RMX_CORBCTL             17
    232242#define HDA_CORBCTL_DMA             RT_BIT(1)   /* Enable CORB DMA Engine */
    233243#define HDA_CORBCTL_CMEIE           RT_BIT(0)   /* CORB Memory Error Interrupt Enable */
    234244
    235 #define HDA_REG_CORBSTS             20          /* 0x4D */
     245#define HDA_REG_CORBSTS             22          /* 0x4D */
    236246#define HDA_RMX_CORBSTS             18
    237247
    238 #define HDA_REG_CORBSIZE            21          /* 0x4E */
     248#define HDA_REG_CORBSIZE            23          /* 0x4E */
    239249#define HDA_RMX_CORBSIZE            19
    240250#define HDA_CORBSIZE_SZ_CAP         0xF0
     
    250260#define HDA_RIRB_ELEMENT_SIZE       8
    251261
    252 #define HDA_REG_RIRBLBASE           22          /* 0x50 */
     262#define HDA_REG_RIRBLBASE           24          /* 0x50 */
    253263#define HDA_RMX_RIRBLBASE           20
    254264
    255 #define HDA_REG_RIRBUBASE           23          /* 0x54 */
     265#define HDA_REG_RIRBUBASE           25          /* 0x54 */
    256266#define HDA_RMX_RIRBUBASE           21
    257267
    258 #define HDA_REG_RIRBWP              24          /* 0x58 */
     268#define HDA_REG_RIRBWP              26          /* 0x58 */
    259269#define HDA_RMX_RIRBWP              22
    260270#define HDA_RIRBWP_RST              RT_BIT(15)  /* RIRB Write Pointer Reset */
    261271
    262 #define HDA_REG_RINTCNT             25          /* 0x5A */
     272#define HDA_REG_RINTCNT             27          /* 0x5A */
    263273#define HDA_RMX_RINTCNT             23
    264274
     
    266276#define HDA_MAX_RINTCNT             256
    267277
    268 #define HDA_REG_RIRBCTL             26          /* 0x5C */
     278#define HDA_REG_RIRBCTL             28          /* 0x5C */
    269279#define HDA_RMX_RIRBCTL             24
    270280#define HDA_RIRBCTL_ROIC            RT_BIT(2)   /* Response Overrun Interrupt Control */
     
    272282#define HDA_RIRBCTL_RINTCTL         RT_BIT(0)   /* Response Interrupt Control */
    273283
    274 #define HDA_REG_RIRBSTS             27          /* 0x5D */
     284#define HDA_REG_RIRBSTS             29          /* 0x5D */
    275285#define HDA_RMX_RIRBSTS             25
    276286#define HDA_RIRBSTS_RIRBOIS         RT_BIT(2)   /* Response Overrun Interrupt Status */
    277287#define HDA_RIRBSTS_RINTFL          RT_BIT(0)   /* Response Interrupt Flag */
    278288
    279 #define HDA_REG_RIRBSIZE            28          /* 0x5E */
     289#define HDA_REG_RIRBSIZE            30          /* 0x5E */
    280290#define HDA_RMX_RIRBSIZE            26
    281291
    282 #define HDA_REG_IC                  29          /* 0x60 */
     292#define HDA_REG_IC                  31          /* 0x60 */
    283293#define HDA_RMX_IC                  27
    284294
    285 #define HDA_REG_IR                  30          /* 0x64 */
     295#define HDA_REG_IR                  32          /* 0x64 */
    286296#define HDA_RMX_IR                  28
    287297
    288 #define HDA_REG_IRS                 31          /* 0x68 */
     298#define HDA_REG_IRS                 33          /* 0x68 */
    289299#define HDA_RMX_IRS                 29
    290300#define HDA_IRS_IRV                 RT_BIT(1)   /* Immediate Result Valid */
    291301#define HDA_IRS_ICB                 RT_BIT(0)   /* Immediate Command Busy */
    292302
    293 #define HDA_REG_DPLBASE             32          /* 0x70 */
     303#define HDA_REG_DPLBASE             34          /* 0x70 */
    294304#define HDA_RMX_DPLBASE             30
    295305
    296 #define HDA_REG_DPUBASE             33          /* 0x74 */
     306#define HDA_REG_DPUBASE             35          /* 0x74 */
    297307#define HDA_RMX_DPUBASE             31
    298308
     
    309319
    310320#define HDA_SD_NUM_FROM_REG(pThis, func, reg)   ((reg - HDA_STREAM_REG_DEF(func, 0)) / 10)
     321#define HDA_SD_TO_REG(a_Name, uSD)              (HDA_STREAM_REG_DEF(a_Name, 0) + (uSD) * 10)
    311322
    312323/** @todo Condense marcos! */
     
    334345#define HDA_SDCTL_SRST              RT_BIT(0)   /* Stream Reset */
    335346
    336 #define HDA_REG_SD0STS              35          /* 0x83; other streams offset by 0x20 */
     347#define HDA_REG_SD0STS              (HDA_NUM_GENERAL_REGS + 1) /* 0x83; other streams offset by 0x20 */
    337348#define HDA_RMX_SD0STS              33
    338349#define HDA_RMX_SD1STS              (HDA_STREAM_RMX_DEF(STS, 0) + 10)
     
    349360#define HDA_SDSTS_BCIS              RT_BIT(2)   /* Buffer Completion Interrupt Status */
    350361
    351 #define HDA_REG_SD0LPIB             36          /* 0x84; other streams offset by 0x20 */
     362#define HDA_REG_SD0LPIB             (HDA_NUM_GENERAL_REGS + 2) /* 0x84; other streams offset by 0x20 */
    352363#define HDA_REG_SD1LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 10) /* 0xA4 */
    353364#define HDA_REG_SD2LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 20) /* 0xC4 */
     
    366377#define HDA_RMX_SD7LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 70)
    367378
    368 #define HDA_REG_SD0CBL              37          /* 0x88; other streams offset by 0x20 */
     379#define HDA_REG_SD0CBL              (HDA_NUM_GENERAL_REGS + 3) /* 0x88; other streams offset by 0x20 */
    369380#define HDA_RMX_SD0CBL              35
    370381#define HDA_RMX_SD1CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 10)
     
    376387#define HDA_RMX_SD7CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 70)
    377388
    378 #define HDA_REG_SD0LVI              38          /* 0x8C; other streams offset by 0x20 */
     389#define HDA_REG_SD0LVI              (HDA_NUM_GENERAL_REGS + 4) /* 0x8C; other streams offset by 0x20 */
    379390#define HDA_RMX_SD0LVI              36
    380391#define HDA_RMX_SD1LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 10)
     
    386397#define HDA_RMX_SD7LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 70)
    387398
    388 #define HDA_REG_SD0FIFOW            39          /* 0x8E; other streams offset by 0x20 */
     399#define HDA_REG_SD0FIFOW            (HDA_NUM_GENERAL_REGS + 5) /* 0x8E; other streams offset by 0x20 */
    389400#define HDA_RMX_SD0FIFOW            37
    390401#define HDA_RMX_SD1FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 10)
     
    403414#define HDA_SDFIFOW_32B             0x4
    404415
    405 #define HDA_REG_SD0FIFOS            40          /* 0x90; other streams offset by 0x20 */
     416#define HDA_REG_SD0FIFOS            (HDA_NUM_GENERAL_REGS + 6) /* 0x90; other streams offset by 0x20 */
    406417#define HDA_RMX_SD0FIFOS            38
    407418#define HDA_RMX_SD1FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 10)
     
    427438#define HDA_SDOFIFO_256B            0xFF        /* 20-, 24-bit Output Streams */
    428439
    429 #define HDA_REG_SD0FMT              41          /* 0x92; other streams offset by 0x20 */
     440#define HDA_REG_SD0FMT              (HDA_NUM_GENERAL_REGS + 7) /* 0x92; other streams offset by 0x20 */
    430441#define HDA_RMX_SD0FMT              39
    431442#define HDA_RMX_SD1FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 10)
     
    437448#define HDA_RMX_SD7FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 70)
    438449
    439 #define HDA_REG_SD0BDPL             42          /* 0x98; other streams offset by 0x20 */
     450#define HDA_REG_SD0BDPL             (HDA_NUM_GENERAL_REGS + 8) /* 0x98; other streams offset by 0x20 */
    440451#define HDA_RMX_SD0BDPL             40
    441452#define HDA_RMX_SD1BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 10)
     
    447458#define HDA_RMX_SD7BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 70)
    448459
    449 #define HDA_REG_SD0BDPU             43          /* 0x9C; other streams offset by 0x20 */
     460#define HDA_REG_SD0BDPU             (HDA_NUM_GENERAL_REGS + 9) /* 0x9C; other streams offset by 0x20 */
    450461#define HDA_RMX_SD0BDPU             41
    451462#define HDA_RMX_SD1BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 10)
     
    513524     | (((_aBits)     & HDA_SDFMT_BITS_MASK)      << HDA_SDFMT_BITS_SHIFT)      \
    514525     | ( (_aChan)     & HDA_SDFMT_CHANNELS_MASK))
     526
     527
     528/* Post stream registers: */
     529#define HDA_REG_MLCH                (HDA_NUM_GENERAL_REGS + HDA_NUM_STREAM_REGS) /* 0xc00 */
     530#define HDA_RMX_MLCH                115
     531#define HDA_REG_MLCD                (HDA_REG_MLCH + 1)      /* 0xc04 */
     532#define HDA_RMX_MLCD                116
     533
     534/* Registers added/specific-to skylake/broxton: */
     535#define HDA_SD_NUM_FROM_SKYLAKE_REG(a_Name, a_iMap)   (((a_iMap) - HDA_STREAM_REG_DEF(a_Name, 0)) / 2)
     536
     537#define HDA_REG_SD0DPIB             (HDA_REG_MLCD + 1)      /* 0x1084 */
     538#define HDA_REG_SD1DPIB             (HDA_REG_SD0DPIB + 1*2)
     539#define HDA_REG_SD2DPIB             (HDA_REG_SD0DPIB + 2*2)
     540#define HDA_REG_SD3DPIB             (HDA_REG_SD0DPIB + 3*2)
     541#define HDA_REG_SD4DPIB             (HDA_REG_SD0DPIB + 4*2)
     542#define HDA_REG_SD5DPIB             (HDA_REG_SD0DPIB + 5*2)
     543#define HDA_REG_SD6DPIB             (HDA_REG_SD0DPIB + 6*2)
     544#define HDA_REG_SD7DPIB             (HDA_REG_SD0DPIB + 7*2)
     545
     546#define HDA_RMX_SD0DPIB             HDA_RMX_SD0LPIB
     547#define HDA_RMX_SD1DPIB             HDA_RMX_SD1LPIB
     548#define HDA_RMX_SD2DPIB             HDA_RMX_SD2LPIB
     549#define HDA_RMX_SD3DPIB             HDA_RMX_SD3LPIB
     550#define HDA_RMX_SD4DPIB             HDA_RMX_SD4LPIB
     551#define HDA_RMX_SD5DPIB             HDA_RMX_SD5LPIB
     552#define HDA_RMX_SD6DPIB             HDA_RMX_SD6LPIB
     553#define HDA_RMX_SD7DPIB             HDA_RMX_SD7LPIB
     554
     555#define HDA_REG_SD0EFIFOS           (HDA_REG_SD0DPIB + 1)   /* 0x1094 */
     556#define HDA_REG_SD1EFIFOS           (HDA_REG_SD0EFIFOS + 1*2)
     557#define HDA_REG_SD2EFIFOS           (HDA_REG_SD0EFIFOS + 2*2)
     558#define HDA_REG_SD3EFIFOS           (HDA_REG_SD0EFIFOS + 3*2)
     559#define HDA_REG_SD4EFIFOS           (HDA_REG_SD0EFIFOS + 4*2)
     560#define HDA_REG_SD5EFIFOS           (HDA_REG_SD0EFIFOS + 5*2)
     561#define HDA_REG_SD6EFIFOS           (HDA_REG_SD0EFIFOS + 6*2)
     562#define HDA_REG_SD7EFIFOS           (HDA_REG_SD0EFIFOS + 7*2)
     563
     564#define HDA_RMX_SD0EFIFOS           117
     565#define HDA_RMX_SD1EFIFOS           (HDA_RMX_SD0EFIFOS + 1)
     566#define HDA_RMX_SD2EFIFOS           (HDA_RMX_SD0EFIFOS + 2)
     567#define HDA_RMX_SD3EFIFOS           (HDA_RMX_SD0EFIFOS + 3)
     568#define HDA_RMX_SD4EFIFOS           (HDA_RMX_SD0EFIFOS + 4)
     569#define HDA_RMX_SD5EFIFOS           (HDA_RMX_SD0EFIFOS + 5)
     570#define HDA_RMX_SD6EFIFOS           (HDA_RMX_SD0EFIFOS + 6)
     571#define HDA_RMX_SD7EFIFOS           (HDA_RMX_SD0EFIFOS + 7)
    515572
    516573/** @} */ /* grp_hda_regs */
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