VirtualBox

Changeset 49217 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 21, 2013 8:44:17 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
90108
Message:

HDA: Made register access more orthogonal, added two missing registers.

File:
1 edited

Legend:

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

    r48997 r49217  
    7474#define BIRD_THINKS_CORBRP_IS_MOSTLY_RO
    7575
    76 #define HDA_NREGS 112
     76#define HDA_NREGS           114
     77#define HDA_NREGS_SAVED     112
     78
     79/**
     80 *  NB: Register values stored in memory (au32Regs[]) are indexed through
     81 *  the HDA_RMX_xxx macros (also HDA_MEM_IND_NAME()). On the other hand, the
     82 *  register descriptors in g_aHdaRegMap[] are indexed through the
     83 *  HDA_REG_xxx macros (also HDA_REG_IND_NAME()).
     84 *
     85 *  The au32Regs[] layout is kept unchanged for saved state
     86 *  compatibility. */
     87
    7788/* Registers */
    7889#define HDA_REG_IND_NAME(x)                 HDA_REG_##x
    79 #define HDA_REG_FIELD_NAME(reg, x)          HDA_##reg##_##x
     90#define HDA_MEM_IND_NAME(x)                 HDA_RMX_##x
    8091#define HDA_REG_FIELD_MASK(reg, x)          HDA_##reg##_##x##_MASK
    8192#define HDA_REG_FIELD_FLAG_MASK(reg, x)     RT_BIT(HDA_##reg##_##x##_SHIFT)
    8293#define HDA_REG_FIELD_SHIFT(reg, x)         HDA_##reg##_##x##_SHIFT
    83 #define HDA_REG_IND(pThis, x)               ((pThis)->au32Regs[(x)])
     94#define HDA_REG_IND(pThis, x)               ((pThis)->au32Regs[g_aHdaRegMap[x].mem_idx])
    8495#define HDA_REG(pThis, x)                   (HDA_REG_IND((pThis), HDA_REG_IND_NAME(x)))
    85 #define HDA_REG_VALUE(pThis, reg, val)      (HDA_REG((pThis),reg) & (((HDA_REG_FIELD_MASK(reg, val))) << (HDA_REG_FIELD_SHIFT(reg, val))))
    8696#define HDA_REG_FLAG_VALUE(pThis, reg, val) (HDA_REG((pThis),reg) & (((HDA_REG_FIELD_FLAG_MASK(reg, val)))))
    87 #define HDA_REG_SVALUE(pThis, reg, val)     (HDA_REG_VALUE(pThis, reg, val) >> (HDA_REG_FIELD_SHIFT(reg, val)))
    88 
    89 #define HDA_REG_GCAP 0 /* range 0x00-0x01*/
    90 #define GCAP(pThis) (HDA_REG((pThis), GCAP))
     97
     98
     99#define HDA_REG_GCAP                0 /* range 0x00-0x01*/
     100#define HDA_RMX_GCAP                0
    91101/* GCAP HDASpec 3.3.2 This macro encodes the following information about HDA in a compact manner:
    92102 * oss (15:12) - number of output streams supported
     
    102112     | (((bds) & 0x3)  << 2)    \
    103113     | ((b64sup) & 1))
    104 #define HDA_REG_VMIN                1 /* range 0x02 */
    105 #define VMIN(pThis)                 (HDA_REG((pThis), VMIN))
    106 
    107 #define HDA_REG_VMAJ                2 /* range 0x03 */
    108 #define VMAJ(pThis)                 (HDA_REG((pThis), VMAJ))
    109 
    110 #define HDA_REG_OUTPAY              3 /* range 0x04-0x05 */
    111 #define OUTPAY(pThis)               (HDA_REG((pThis), OUTPAY))
    112 
    113 #define HDA_REG_INPAY               4 /* range 0x06-0x07 */
    114 #define INPAY(pThis)                (HDA_REG((pThis), INPAY))
    115 
    116 #define HDA_REG_GCTL                5
     114
     115#define HDA_REG_VMIN                1 /* 0x02 */
     116#define HDA_RMX_VMIN                1
     117
     118#define HDA_REG_VMAJ                2 /* 0x03 */
     119#define HDA_RMX_VMAJ                2
     120
     121#define HDA_REG_OUTPAY              3 /* 0x04-0x05 */
     122#define HDA_RMX_OUTPAY              3
     123
     124#define HDA_REG_INPAY               4 /* 0x06-0x07 */
     125#define HDA_RMX_INPAY               4
     126
     127#define HDA_REG_GCTL                5 /* 0x08-0x0B */
     128#define HDA_RMX_GCTL                5
    117129#define HDA_GCTL_RST_SHIFT          0
    118130#define HDA_GCTL_FSH_SHIFT          1
    119131#define HDA_GCTL_UR_SHIFT           8
    120 #define GCTL(pThis)                 (HDA_REG((pThis), GCTL))
    121132
    122133#define HDA_REG_WAKEEN              6 /* 0x0C */
    123 #define WAKEEN(pThis)               (HDA_REG((pThis), WAKEEN))
    124 
    125 #define HDA_REG_STATESTS            7 /* range 0x0E */
    126 #define STATESTS(pThis)             (HDA_REG((pThis), STATESTS))
     134#define HDA_RMX_WAKEEN              6
     135
     136#define HDA_REG_STATESTS            7 /* 0x0E */
     137#define HDA_RMX_STATESTS            7
    127138#define HDA_STATES_SCSF             0x7
    128139
    129 #define HDA_REG_GSTS                8 /* range 0x10-0x11*/
     140#define HDA_REG_GSTS                8 /* 0x10-0x11*/
     141#define HDA_RMX_GSTS                8
    130142#define HDA_GSTS_FSH_SHIFT          1
    131 #define GSTS(pThis)                 (HDA_REG(pThis, GSTS))
    132 
    133 #define HDA_REG_INTCTL              9 /* 0x20 */
     143
     144#define HDA_REG_OUTSTRMPAY          9  /* 0x18 */
     145#define HDA_RMX_OUTSTRMPAY          112
     146
     147#define HDA_REG_INSTRMPAY           10 /* 0x1a */
     148#define HDA_RMX_INSTRMPAY           113
     149
     150#define HDA_REG_INTCTL              11 /* 0x20 */
     151#define HDA_RMX_INTCTL              9
    134152#define HDA_INTCTL_GIE_SHIFT        31
    135153#define HDA_INTCTL_CIE_SHIFT        30
     
    142160#define HDA_INTCTL_S6_SHIFT         6
    143161#define HDA_INTCTL_S7_SHIFT         7
    144 #define INTCTL(pThis)               (HDA_REG((pThis), INTCTL))
    145 #define INTCTL_GIE(pThis)           (HDA_REG_FLAG_VALUE(pThis, INTCTL, GIE))
    146 #define INTCTL_CIE(pThis)           (HDA_REG_FLAG_VALUE(pThis, INTCTL, CIE))
    147162#define INTCTL_SX(pThis, X)         (HDA_REG_FLAG_VALUE((pThis), INTCTL, S##X))
    148 #define INTCTL_SALL(pThis)          (INTCTL((pThis)) & 0xFF)
    149 
    150 /* Note: The HDA specification defines a SSYNC register at offset 0x38. The
    151  * ICH6/ICH9 datahseet defines SSYNC at offset 0x34. The Linux HDA driver matches
    152  * the datasheet.
    153  */
    154 #define HDA_REG_SSYNC               12 /* 0x34 */
    155 #define SSYNC(pThis)                (HDA_REG((pThis), SSYNC))
    156 
    157 #define HDA_REG_INTSTS              10 /* 0x24 */
     163
     164#define HDA_REG_INTSTS              12 /* 0x24 */
     165#define HDA_RMX_INTSTS              10
    158166#define HDA_INTSTS_GIS_SHIFT        31
    159167#define HDA_INTSTS_CIS_SHIFT        30
     
    167175#define HDA_INTSTS_S7_SHIFT         7
    168176#define HDA_INTSTS_S_MASK(num)      RT_BIT(HDA_REG_FIELD_SHIFT(S##num))
    169 #define INTSTS(pThis)               (HDA_REG((pThis), INTSTS))
    170 #define INTSTS_GIS(pThis)           (HDA_REG_FLAG_VALUE((pThis), INTSTS, GIS)
    171 #define INTSTS_CIS(pThis)           (HDA_REG_FLAG_VALUE((pThis), INTSTS, CIS)
    172 #define INTSTS_SX(pThis, X)         (HDA_REG_FLAG_VALUE(pThis), INTSTS, S##X)
    173 #define INTSTS_SANY(pThis)          (INTSTS((pThis)) & 0xFF)
    174 
    175 #define HDA_REG_CORBLBASE           13 /* 0x40 */
    176 #define CORBLBASE(pThis)            (HDA_REG((pThis), CORBLBASE))
    177 #define HDA_REG_CORBUBASE           14 /* 0x44 */
    178 #define CORBUBASE(pThis)            (HDA_REG((pThis), CORBUBASE))
    179 #define HDA_REG_CORBWP              15 /* 48 */
    180 #define HDA_REG_CORBRP              16 /* 4A */
     177
     178#define HDA_REG_WALCLK              13 /* 0x24 */
     179#define HDA_RMX_WALCLK              /* Not defined! */
     180
     181/* Note: The HDA specification defines a SSYNC register at offset 0x38. The
     182 * ICH6/ICH9 datahseet defines SSYNC at offset 0x34. The Linux HDA driver matches
     183 * the datasheet.
     184 */
     185#define HDA_REG_SSYNC               14 /* 0x34 */
     186#define HDA_RMX_SSYNC               12
     187
     188#define HDA_REG_CORBLBASE           15 /* 0x40 */
     189#define HDA_RMX_CORBLBASE           13
     190
     191#define HDA_REG_CORBUBASE           16 /* 0x44 */
     192#define HDA_RMX_CORBUBASE           14
     193
     194#define HDA_REG_CORBWP              17 /* 0x48 */
     195#define HDA_RMX_CORBWP              15
     196
     197#define HDA_REG_CORBRP              18 /* 0x4A */
     198#define HDA_RMX_CORBRP              16
    181199#define HDA_CORBRP_RST_SHIFT        15
    182200#define HDA_CORBRP_WP_SHIFT         0
    183201#define HDA_CORBRP_WP_MASK          0xFF
    184202
    185 #define CORBRP(pThis)               (HDA_REG(pThis, CORBRP))
    186 #define CORBWP(pThis)               (HDA_REG(pThis, CORBWP))
    187 
    188 #define HDA_REG_CORBCTL             17 /* 0x4C */
     203#define HDA_REG_CORBCTL             19 /* 0x4C */
     204#define HDA_RMX_CORBCTL             17
    189205#define HDA_CORBCTL_DMA_SHIFT       1
    190206#define HDA_CORBCTL_CMEIE_SHIFT     0
    191207
    192 #define CORBCTL(pThis)              (HDA_REG(pThis, CORBCTL))
    193 
    194 
    195 #define HDA_REG_CORBSTS             18 /* 0x4D */
    196 #define CORBSTS(pThis)              (HDA_REG(pThis, CORBSTS))
     208#define HDA_REG_CORBSTS             20 /* 0x4D */
     209#define HDA_RMX_CORBSTS             18
    197210#define HDA_CORBSTS_CMEI_SHIFT      0
    198211
    199 #define HDA_REG_CORBSIZE            19 /* 0x4E */
     212#define HDA_REG_CORBSIZE            21 /* 0x4E */
     213#define HDA_RMX_CORBSIZE            19
    200214#define HDA_CORBSIZE_SZ_CAP         0xF0
    201215#define HDA_CORBSIZE_SZ             0x3
    202 #define CORBSIZE_SZ(pThis)          (HDA_REG(pThis, HDA_REG_CORBSIZE) & HDA_CORBSIZE_SZ)
    203 #define CORBSIZE_SZ_CAP(pThis)      (HDA_REG(pThis, HDA_REG_CORBSIZE) & HDA_CORBSIZE_SZ_CAP)
    204216/* till ich 10 sizes of CORB and RIRB are hardcoded to 256 in real hw */
    205217
    206 #define HDA_REG_RIRLBASE            20 /* 0x50 */
    207 #define RIRLBASE(pThis)             (HDA_REG((pThis), RIRLBASE))
    208 
    209 #define HDA_REG_RIRUBASE            21 /* 0x54 */
    210 #define RIRUBASE(pThis)             (HDA_REG((pThis), RIRUBASE))
    211 
    212 #define HDA_REG_RIRBWP              22 /* 0x58 */
     218#define HDA_REG_RIRBLBASE           22 /* 0x50 */
     219#define HDA_RMX_RIRBLBASE           20
     220
     221#define HDA_REG_RIRBUBASE           23 /* 0x54 */
     222#define HDA_RMX_RIRBUBASE           21
     223
     224#define HDA_REG_RIRBWP              24 /* 0x58 */
     225#define HDA_RMX_RIRBWP              22
    213226#define HDA_RIRBWP_RST_SHIFT        15
    214227#define HDA_RIRBWP_WP_MASK          0xFF
    215 #define RIRBWP(pThis)              (HDA_REG(pThis, RIRBWP))
    216 
    217 #define HDA_REG_RINTCNT             23 /* 0x5A */
    218 #define RINTCNT(pThis)              (HDA_REG((pThis), RINTCNT))
    219 #define RINTCNT_N(pThis)            (RINTCNT((pThis)) & 0xff)
    220 
    221 #define HDA_REG_RIRBCTL             24 /* 0x5C */
     228
     229#define HDA_REG_RINTCNT             25 /* 0x5A */
     230#define HDA_RMX_RINTCNT             23
     231#define RINTCNT_N(pThis)            (HDA_REG(pThis, RINTCNT) & 0xff)
     232
     233#define HDA_REG_RIRBCTL             26 /* 0x5C */
     234#define HDA_RMX_RIRBCTL             24
    222235#define HDA_RIRBCTL_RIC_SHIFT       0
    223236#define HDA_RIRBCTL_DMA_SHIFT       1
    224237#define HDA_ROI_DMA_SHIFT           2
    225 #define RIRBCTL(pThis)              (HDA_REG((pThis), RIRBCTL))
    226 #define RIRBCTL_RIRB_RIC(pThis)     (HDA_REG_FLAG_VALUE(pThis, RIRBCTL, RIC))
    227 #define RIRBCTL_RIRB_DMA(pThis)     (HDA_REG_FLAG_VALUE((pThis), RIRBCTL, DMA)
    228 #define RIRBCTL_ROI(pThis)          (HDA_REG_FLAG_VALUE((pThis), RIRBCTL, ROI))
    229 
    230 #define HDA_REG_RIRBSTS             25 /* 0x5D */
     238
     239#define HDA_REG_RIRBSTS             27 /* 0x5D */
     240#define HDA_RMX_RIRBSTS             25
    231241#define HDA_RIRBSTS_RINTFL_SHIFT    0
    232242#define HDA_RIRBSTS_RIRBOIS_SHIFT   2
    233 #define RIRBSTS(pThis)              (HDA_REG(pThis, RIRBSTS))
    234 #define RIRBSTS_RINTFL(pThis)       (HDA_REG_FLAG_VALUE(pThis, RIRBSTS, RINTFL))
    235 #define RIRBSTS_RIRBOIS(pThis)      (HDA_REG_FLAG_VALUE(pThis, RIRBSTS, RIRBOIS))
    236 
    237 #define HDA_REG_RIRBSIZE            26 /* 0x5E */
     243
     244#define HDA_REG_RIRBSIZE            28 /* 0x5E */
     245#define HDA_RMX_RIRBSIZE            26
    238246#define HDA_RIRBSIZE_SZ_CAP         0xF0
    239247#define HDA_RIRBSIZE_SZ             0x3
     
    243251
    244252
    245 #define HDA_REG_IC                  27 /* 0x60 */
    246 #define IC(pThis)                   (HDA_REG(pThis, IC))
    247 #define HDA_REG_IR                  28 /* 0x64 */
    248 #define IR(pThis)                   (HDA_REG(pThis, IR))
    249 #define HDA_REG_IRS                 29 /* 0x68 */
     253#define HDA_REG_IC                  29 /* 0x60 */
     254#define HDA_RMX_IC                  27
     255
     256#define HDA_REG_IR                  30 /* 0x64 */
     257#define HDA_RMX_IR                  28
     258
     259#define HDA_REG_IRS                 31 /* 0x68 */
     260#define HDA_RMX_IRS                 29
    250261#define HDA_IRS_ICB_SHIFT           0
    251262#define HDA_IRS_IRV_SHIFT           1
    252 #define IRS(pThis)                  (HDA_REG(pThis, IRS))
    253 #define IRS_ICB(pThis)              (HDA_REG_FLAG_VALUE(pThis, IRS, ICB))
    254 #define IRS_IRV(pThis)              (HDA_REG_FLAG_VALUE(pThis, IRS, IRV))
    255 
    256 #define HDA_REG_DPLBASE             30 /* 0x70 */
     263
     264#define HDA_REG_DPLBASE             32 /* 0x70 */
     265#define HDA_RMX_DPLBASE             30
    257266#define DPLBASE(pThis)              (HDA_REG((pThis), DPLBASE))
    258 #define HDA_REG_DPUBASE             31 /* 0x74 */
     267
     268#define HDA_REG_DPUBASE             33 /* 0x74 */
     269#define HDA_RMX_DPUBASE             31
    259270#define DPUBASE(pThis)              (HDA_REG((pThis), DPUBASE))
    260271#define DPBASE_ENABLED              1
     
    262273
    263274#define HDA_STREAM_REG_DEF(name, num)           (HDA_REG_SD##num##name)
    264 #define HDA_STREAM_REG(pThis, name, num)        (HDA_REG((pThis), N_(HDA_STREAM_REG_DEF(name, num))))
     275#define HDA_STREAM_RMX_DEF(name, num)           (HDA_RMX_SD##num##name)
    265276/* Note: sdnum here _MUST_ be stream reg number [0,7] */
    266 #define HDA_STREAM_REG2(pThis, name, sdnum)     (HDA_REG_IND((pThis), HDA_REG_SD0##name + (sdnum) * 10))
    267 
    268 #define HDA_REG_SD0CTL              32 /* 0x80 */
     277#define HDA_STREAM_REG(pThis, name, sdnum)     (HDA_REG_IND((pThis), HDA_REG_SD0##name + (sdnum) * 10))
     278
     279#define HDA_REG_SD0CTL              34 /* 0x80 */
    269280#define HDA_REG_SD1CTL              (HDA_STREAM_REG_DEF(CTL, 0) + 10) /* 0xA0 */
    270281#define HDA_REG_SD2CTL              (HDA_STREAM_REG_DEF(CTL, 0) + 20) /* 0xC0 */
     
    274285#define HDA_REG_SD6CTL              (HDA_STREAM_REG_DEF(CTL, 0) + 60) /* 0x140 */
    275286#define HDA_REG_SD7CTL              (HDA_STREAM_REG_DEF(CTL, 0) + 70) /* 0x160 */
     287#define HDA_RMX_SD0CTL              32
     288#define HDA_RMX_SD1CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 10)
     289#define HDA_RMX_SD2CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 20)
     290#define HDA_RMX_SD3CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 30)
     291#define HDA_RMX_SD4CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 40)
     292#define HDA_RMX_SD5CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 50)
     293#define HDA_RMX_SD6CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 60)
     294#define HDA_RMX_SD7CTL              (HDA_STREAM_RMX_DEF(CTL, 0) + 70)
    276295
    277296#define SD(func, num)               SD##num##func
     
    290309#define HDA_SDCTL_SRST_SHIFT        0
    291310
    292 #define HDA_REG_SD0STS              33 /* 0x83 */
     311#define HDA_REG_SD0STS              35 /* 0x83 */
    293312#define HDA_REG_SD1STS              (HDA_STREAM_REG_DEF(STS, 0) + 10) /* 0xA3 */
    294313#define HDA_REG_SD2STS              (HDA_STREAM_REG_DEF(STS, 0) + 20) /* 0xC3 */
     
    298317#define HDA_REG_SD6STS              (HDA_STREAM_REG_DEF(STS, 0) + 60) /* 0x143 */
    299318#define HDA_REG_SD7STS              (HDA_STREAM_REG_DEF(STS, 0) + 70) /* 0x163 */
     319#define HDA_RMX_SD0STS              33
     320#define HDA_RMX_SD1STS              (HDA_STREAM_RMX_DEF(STS, 0) + 10)
     321#define HDA_RMX_SD2STS              (HDA_STREAM_RMX_DEF(STS, 0) + 20)
     322#define HDA_RMX_SD3STS              (HDA_STREAM_RMX_DEF(STS, 0) + 30)
     323#define HDA_RMX_SD4STS              (HDA_STREAM_RMX_DEF(STS, 0) + 40)
     324#define HDA_RMX_SD5STS              (HDA_STREAM_RMX_DEF(STS, 0) + 50)
     325#define HDA_RMX_SD6STS              (HDA_STREAM_RMX_DEF(STS, 0) + 60)
     326#define HDA_RMX_SD7STS              (HDA_STREAM_RMX_DEF(STS, 0) + 70)
    300327
    301328#define SDSTS(pThis, num)           HDA_REG((pThis), SD(STS, num))
     
    305332#define HDA_SDSTS_BCIS_SHIFT        2
    306333
    307 #define HDA_REG_SD0LPIB             34 /* 0x84 */
     334#define HDA_REG_SD0LPIB             36 /* 0x84 */
    308335#define HDA_REG_SD1LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 10) /* 0xA4 */
    309336#define HDA_REG_SD2LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 20) /* 0xC4 */
     
    313340#define HDA_REG_SD6LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 60) /* 0x144 */
    314341#define HDA_REG_SD7LPIB             (HDA_STREAM_REG_DEF(LPIB, 0) + 70) /* 0x164 */
    315 
    316 #define SDLPIB(pThis, num)          HDA_REG((pThis), SD(LPIB, num))
    317 
    318 #define HDA_REG_SD0CBL              35 /* 0x88 */
     342#define HDA_RMX_SD0LPIB             34
     343#define HDA_RMX_SD1LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 10)
     344#define HDA_RMX_SD2LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 20)
     345#define HDA_RMX_SD3LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 30)
     346#define HDA_RMX_SD4LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 40)
     347#define HDA_RMX_SD5LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 50)
     348#define HDA_RMX_SD6LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 60)
     349#define HDA_RMX_SD7LPIB             (HDA_STREAM_RMX_DEF(LPIB, 0) + 70)
     350
     351#define HDA_REG_SD0CBL              37 /* 0x88 */
    319352#define HDA_REG_SD1CBL              (HDA_STREAM_REG_DEF(CBL, 0) + 10) /* 0xA8 */
    320353#define HDA_REG_SD2CBL              (HDA_STREAM_REG_DEF(CBL, 0) + 20) /* 0xC8 */
     
    324357#define HDA_REG_SD6CBL              (HDA_STREAM_REG_DEF(CBL, 0) + 60) /* 0x148 */
    325358#define HDA_REG_SD7CBL              (HDA_STREAM_REG_DEF(CBL, 0) + 70) /* 0x168 */
    326 
    327 #define SDLCBL(pThis, num)          HDA_REG((pThis), SD(CBL, num))
    328 
    329 #define HDA_REG_SD0LVI              36 /* 0x8C */
     359#define HDA_RMX_SD0CBL              35
     360#define HDA_RMX_SD1CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 10)
     361#define HDA_RMX_SD2CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 20)
     362#define HDA_RMX_SD3CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 30)
     363#define HDA_RMX_SD4CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 40)
     364#define HDA_RMX_SD5CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 50)
     365#define HDA_RMX_SD6CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 60)
     366#define HDA_RMX_SD7CBL              (HDA_STREAM_RMX_DEF(CBL, 0) + 70)
     367
     368
     369#define HDA_REG_SD0LVI              38 /* 0x8C */
    330370#define HDA_REG_SD1LVI              (HDA_STREAM_REG_DEF(LVI, 0) + 10) /* 0xAC */
    331371#define HDA_REG_SD2LVI              (HDA_STREAM_REG_DEF(LVI, 0) + 20) /* 0xCC */
     
    335375#define HDA_REG_SD6LVI              (HDA_STREAM_REG_DEF(LVI, 0) + 60) /* 0x14C */
    336376#define HDA_REG_SD7LVI              (HDA_STREAM_REG_DEF(LVI, 0) + 70) /* 0x16C */
    337 
    338 #define SDLVI(pThis, num)           HDA_REG((pThis), SD(LVI, num))
    339 
    340 #define HDA_REG_SD0FIFOW            37 /* 0x8E */
     377#define HDA_RMX_SD0LVI              36
     378#define HDA_RMX_SD1LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 10)
     379#define HDA_RMX_SD2LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 20)
     380#define HDA_RMX_SD3LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 30)
     381#define HDA_RMX_SD4LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 40)
     382#define HDA_RMX_SD5LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 50)
     383#define HDA_RMX_SD6LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 60)
     384#define HDA_RMX_SD7LVI              (HDA_STREAM_RMX_DEF(LVI, 0) + 70)
     385
     386#define HDA_REG_SD0FIFOW            39 /* 0x8E */
    341387#define HDA_REG_SD1FIFOW            (HDA_STREAM_REG_DEF(FIFOW, 0) + 10) /* 0xAE */
    342388#define HDA_REG_SD2FIFOW            (HDA_STREAM_REG_DEF(FIFOW, 0) + 20) /* 0xCE */
     
    346392#define HDA_REG_SD6FIFOW            (HDA_STREAM_REG_DEF(FIFOW, 0) + 60) /* 0x14E */
    347393#define HDA_REG_SD7FIFOW            (HDA_STREAM_REG_DEF(FIFOW, 0) + 70) /* 0x16E */
     394#define HDA_RMX_SD0FIFOW            37
     395#define HDA_RMX_SD1FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 10)
     396#define HDA_RMX_SD2FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 20)
     397#define HDA_RMX_SD3FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 30)
     398#define HDA_RMX_SD4FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 40)
     399#define HDA_RMX_SD5FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 50)
     400#define HDA_RMX_SD6FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 60)
     401#define HDA_RMX_SD7FIFOW            (HDA_STREAM_RMX_DEF(FIFOW, 0) + 70)
    348402
    349403/*
     
    353407#define HDA_SDFIFOW_16B             0x3
    354408#define HDA_SDFIFOW_32B             0x4
    355 #define SDFIFOW(pThis, num)         HDA_REG((pThis), SD(FIFOW, num))
    356 
    357 #define HDA_REG_SD0FIFOS            38 /* 0x90 */
     409
     410#define HDA_REG_SD0FIFOS            40 /* 0x90 */
    358411#define HDA_REG_SD1FIFOS            (HDA_STREAM_REG_DEF(FIFOS, 0) + 10) /* 0xB0 */
    359412#define HDA_REG_SD2FIFOS            (HDA_STREAM_REG_DEF(FIFOS, 0) + 20) /* 0xD0 */
     
    363416#define HDA_REG_SD6FIFOS            (HDA_STREAM_REG_DEF(FIFOS, 0) + 60) /* 0x150 */
    364417#define HDA_REG_SD7FIFOS            (HDA_STREAM_REG_DEF(FIFOS, 0) + 70) /* 0x170 */
     418#define HDA_RMX_SD0FIFOS            38
     419#define HDA_RMX_SD1FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 10)
     420#define HDA_RMX_SD2FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 20)
     421#define HDA_RMX_SD3FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 30)
     422#define HDA_RMX_SD4FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 40)
     423#define HDA_RMX_SD5FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 50)
     424#define HDA_RMX_SD6FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 60)
     425#define HDA_RMX_SD7FIFOS            (HDA_STREAM_RMX_DEF(FIFOS, 0) + 70)
    365426
    366427/*
     
    379440#define SDFIFOS(pThis, num)         HDA_REG((pThis), SD(FIFOS, num))
    380441
    381 #define HDA_REG_SD0FMT              39 /* 0x92 */
     442#define HDA_REG_SD0FMT              41 /* 0x92 */
    382443#define HDA_REG_SD1FMT              (HDA_STREAM_REG_DEF(FMT, 0) + 10) /* 0xB2 */
    383444#define HDA_REG_SD2FMT              (HDA_STREAM_REG_DEF(FMT, 0) + 20) /* 0xD2 */
     
    387448#define HDA_REG_SD6FMT              (HDA_STREAM_REG_DEF(FMT, 0) + 60) /* 0x152 */
    388449#define HDA_REG_SD7FMT              (HDA_STREAM_REG_DEF(FMT, 0) + 70) /* 0x172 */
     450#define HDA_RMX_SD0FMT              39
     451#define HDA_RMX_SD1FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 10)
     452#define HDA_RMX_SD2FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 20)
     453#define HDA_RMX_SD3FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 30)
     454#define HDA_RMX_SD4FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 40)
     455#define HDA_RMX_SD5FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 50)
     456#define HDA_RMX_SD6FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 60)
     457#define HDA_RMX_SD7FMT              (HDA_STREAM_RMX_DEF(FMT, 0) + 70)
    389458
    390459#define SDFMT(pThis, num)           (HDA_REG((pThis), SD(FMT, num)))
     
    400469#define SDFMT_DIV(pThis, num)       ((SDFMT((pThis), num) & HDA_REG_FIELD_MASK(SDFMT,DIV)) >> HDA_REG_FIELD_SHIFT(SDFMT, DIV))
    401470
    402 #define HDA_REG_SD0BDPL             40 /* 0x98 */
     471#define HDA_REG_SD0BDPL             42 /* 0x98 */
    403472#define HDA_REG_SD1BDPL             (HDA_STREAM_REG_DEF(BDPL, 0) + 10) /* 0xB8 */
    404473#define HDA_REG_SD2BDPL             (HDA_STREAM_REG_DEF(BDPL, 0) + 20) /* 0xD8 */
     
    408477#define HDA_REG_SD6BDPL             (HDA_STREAM_REG_DEF(BDPL, 0) + 60) /* 0x158 */
    409478#define HDA_REG_SD7BDPL             (HDA_STREAM_REG_DEF(BDPL, 0) + 70) /* 0x178 */
    410 
    411 #define SDBDPL(pThis, num)          HDA_REG((pThis), SD(BDPL, num))
    412 
    413 #define HDA_REG_SD0BDPU             41 /* 0x9C */
     479#define HDA_RMX_SD0BDPL             40
     480#define HDA_RMX_SD1BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 10)
     481#define HDA_RMX_SD2BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 20)
     482#define HDA_RMX_SD3BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 30)
     483#define HDA_RMX_SD4BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 40)
     484#define HDA_RMX_SD5BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 50)
     485#define HDA_RMX_SD6BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 60)
     486#define HDA_RMX_SD7BDPL             (HDA_STREAM_RMX_DEF(BDPL, 0) + 70)
     487
     488#define HDA_REG_SD0BDPU             43 /* 0x9C */
    414489#define HDA_REG_SD1BDPU             (HDA_STREAM_REG_DEF(BDPU, 0) + 10) /* 0xBC */
    415490#define HDA_REG_SD2BDPU             (HDA_STREAM_REG_DEF(BDPU, 0) + 20) /* 0xDC */
     
    419494#define HDA_REG_SD6BDPU             (HDA_STREAM_REG_DEF(BDPU, 0) + 60) /* 0x15C */
    420495#define HDA_REG_SD7BDPU             (HDA_STREAM_REG_DEF(BDPU, 0) + 70) /* 0x17C */
    421 
    422 #define SDBDPU(pThis, num)          HDA_REG((pThis), SD(BDPU, num))
     496#define HDA_RMX_SD0BDPU             41
     497#define HDA_RMX_SD1BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 10)
     498#define HDA_RMX_SD2BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 20)
     499#define HDA_RMX_SD3BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 30)
     500#define HDA_RMX_SD4BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 40)
     501#define HDA_RMX_SD5BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 50)
     502#define HDA_RMX_SD6BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 60)
     503#define HDA_RMX_SD7BDPU             (HDA_STREAM_RMX_DEF(BDPU, 0) + 70)
    423504
    424505
     
    518599static FNPDMDEVRESET hdaReset;
    519600
    520 static int hdaRegReadUnimplemented(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
    521 static int hdaRegWriteUnimplemented(PHDASTATE pThis, uint32_t iReg, uint32_t pu32Value);
    522 static int hdaRegReadGCTL(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
     601static int hdaRegReadUnimpl(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
     602static int hdaRegWriteUnimpl(PHDASTATE pThis, uint32_t iReg, uint32_t pu32Value);
    523603static int hdaRegWriteGCTL(PHDASTATE pThis, uint32_t iReg, uint32_t pu32Value);
    524604static int hdaRegReadSTATESTS(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
    525605static int hdaRegWriteSTATESTS(PHDASTATE pThis, uint32_t iReg, uint32_t pu32Value);
    526 static int hdaRegReadGCAP(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
    527606static int hdaRegReadINTSTS(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
    528607static int hdaRegReadWALCLK(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
     
    537616static int hdaRegReadIRS(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
    538617static int hdaRegWriteSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
    539 static int hdaRegReadSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value);
    540618
    541619static int hdaRegWriteSDSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
     
    569647*   Global Variables                                                           *
    570648*******************************************************************************/
     649
    571650/* see 302349 p 6.2*/
    572651static const struct HDAREGDESC
     
    584663    /** Write callback. */
    585664    int       (*pfnWrite)(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value);
     665    /** Index into the register storage array. */
     666    uint32_t    mem_idx;
    586667    /** Abbreviated name. */
    587668    const char *abbrev;
    588     /** Full name. */
    589     const char *name;
    590669} g_aHdaRegMap[HDA_NREGS] =
    591 {
    592     /* offset  size     read mask   write mask         read callback         write callback         abbrev      full name                     */
    593     /*-------  -------  ----------  ----------  -----------------------  ------------------------ ----------    ------------------------------*/
    594     { 0x00000, 0x00002, 0x0000FFFB, 0x00000000, hdaRegReadGCAP         , hdaRegWriteUnimplemented, "GCAP"      , "Global Capabilities" },
    595     { 0x00002, 0x00001, 0x000000FF, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimplemented, "VMIN"      , "Minor Version" },
    596     { 0x00003, 0x00001, 0x000000FF, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimplemented, "VMAJ"      , "Major Version" },
    597     { 0x00004, 0x00002, 0x0000FFFF, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimplemented, "OUTPAY"    , "Output Payload Capabilities" },
    598     { 0x00006, 0x00002, 0x0000FFFF, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimplemented, "INPAY"     , "Input Payload Capabilities" },
    599     { 0x00008, 0x00004, 0x00000103, 0x00000103, hdaRegReadGCTL         , hdaRegWriteGCTL         , "GCTL"      , "Global Control" },
    600     { 0x0000c, 0x00002, 0x00007FFF, 0x00007FFF, hdaRegReadU16          , hdaRegWriteU16          , "WAKEEN"    , "Wake Enable" },
    601     { 0x0000e, 0x00002, 0x00000007, 0x00000007, hdaRegReadU8           , hdaRegWriteSTATESTS     , "STATESTS"  , "State Change Status" },
    602     { 0x00010, 0x00002, 0xFFFFFFFF, 0x00000000, hdaRegReadUnimplemented, hdaRegWriteUnimplemented, "GSTS"      , "Global Status" },
    603     { 0x00020, 0x00004, 0xC00000FF, 0xC00000FF, hdaRegReadU32          , hdaRegWriteU32          , "INTCTL"    , "Interrupt Control" },
    604     { 0x00024, 0x00004, 0xC00000FF, 0x00000000, hdaRegReadINTSTS       , hdaRegWriteUnimplemented, "INTSTS"    , "Interrupt Status" },
    605     { 0x00030, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadWALCLK       , hdaRegWriteUnimplemented, "WALCLK"    , "Wall Clock Counter" },
     670
     671/* Turn a short register name into an memory index and a stringized name. */
     672#define RA(abbrev)  HDA_MEM_IND_NAME(abbrev), #abbrev
     673/* Same as above for an input stream ('I' prefixed). */
     674#define IA(abbrev)  HDA_MEM_IND_NAME(abbrev), "I"#abbrev
     675/* Same as above for an output stream ('O' prefixed). */
     676#define OA(abbrev)  HDA_MEM_IND_NAME(abbrev), "O"#abbrev
     677/* Same as above for a register *not* stored in memory. */
     678#define UA(abbrev)  0, #abbrev
     679
     680{
     681    /* offset  size     read mask   write mask         read callback         write callback         abbrev     */
     682    /*-------  -------  ----------  ----------  -----------------------  ------------------------ ----------   */
     683    { 0x00000, 0x00002, 0x0000FFFB, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimpl     , RA(GCAP)      }, /* Global Capabilities */
     684    { 0x00002, 0x00001, 0x000000FF, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimpl     , RA(VMIN)      }, /* Minor Version */
     685    { 0x00003, 0x00001, 0x000000FF, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimpl     , RA(VMAJ)      }, /* Major Version */
     686    { 0x00004, 0x00002, 0x0000FFFF, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimpl     , RA(OUTPAY)    }, /* Output Payload Capabilities */
     687    { 0x00006, 0x00002, 0x0000FFFF, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimpl     , RA(INPAY)     }, /* Input Payload Capabilities */
     688    { 0x00008, 0x00004, 0x00000103, 0x00000103, hdaRegReadU32          , hdaRegWriteGCTL       , RA(GCTL)      }, /* Global Control */
     689    { 0x0000c, 0x00002, 0x00007FFF, 0x00007FFF, hdaRegReadU16          , hdaRegWriteU16        , RA(WAKEEN)    }, /* Wake Enable */
     690    { 0x0000e, 0x00002, 0x00000007, 0x00000007, hdaRegReadU8           , hdaRegWriteSTATESTS   , RA(STATESTS)  }, /* State Change Status */
     691    { 0x00010, 0x00002, 0xFFFFFFFF, 0x00000000, hdaRegReadUnimpl       , hdaRegWriteUnimpl     , RA(GSTS)      }, /* Global Status */
     692    { 0x00018, 0x00002, 0x0000FFFF, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimpl     , RA(OUTSTRMPAY)}, /* Output Stream Payload Capability */
     693    { 0x0001A, 0x00002, 0x0000FFFF, 0x00000000, hdaRegReadU16          , hdaRegWriteUnimpl     , RA(INSTRMPAY) }, /* Input Stream Payload Capability */
     694    { 0x00020, 0x00004, 0xC00000FF, 0xC00000FF, hdaRegReadU32          , hdaRegWriteU32        , RA(INTCTL)    }, /* Interrupt Control */
     695    { 0x00024, 0x00004, 0xC00000FF, 0x00000000, hdaRegReadINTSTS       , hdaRegWriteUnimpl     , RA(INTSTS)    }, /* Interrupt Status */
     696    { 0x00030, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadWALCLK       , hdaRegWriteUnimpl     , UA(WALCLK)    }, /* Wall Clock Counter */
    606697    /// @todo r=michaln: Doesn't the SSYNC register need to actually stop the stream(s)?
    607     { 0x00034, 0x00004, 0x000000FF, 0x000000FF, hdaRegReadU32          , hdaRegWriteU32          , "SSYNC"     , "Stream Synchronization" },
    608     { 0x00040, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteBase         , "CORBLBASE" , "CORB Lower Base Address" },
    609     { 0x00044, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteBase         , "CORBUBASE" , "CORB Upper Base Address" },
    610     { 0x00048, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteCORBWP       , "CORBWP"    , "CORB Write Pointer" },
    611 #ifdef OLD_REGISTER_TABLE
    612     { 0x0004A, 0x00002, 0x000000FF, 0x000080FF, hdaRegReadU8           , hdaRegWriteCORBRP       , "CORBRP"    , "CORB Read Pointer" },
    613 #else /** @todo 18.2.17 indicates that the 15th bit can be read as well as and written. hdaRegReadU8 is wrong, a special reader should be used. */
    614     { 0x0004A, 0x00002, 0x000080FF, 0x000080FF, hdaRegReadU16          , hdaRegWriteCORBRP       , "CORBRP"    , "CORB Read Pointer" },
    615 #endif
    616     { 0x0004C, 0x00001, 0x00000003, 0x00000003, hdaRegReadU8           , hdaRegWriteCORBCTL      , "CORBCTL"   , "CORB Control" },
    617     { 0x0004D, 0x00001, 0x00000001, 0x00000001, hdaRegReadU8           , hdaRegWriteCORBSTS      , "CORBSTS"   , "CORB Status" },
    618     { 0x0004E, 0x00001, 0x000000F3, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimplemented, "CORBSIZE"  , "CORB Size" },
    619     { 0x00050, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteBase         , "RIRBLBASE" , "RIRB Lower Base Address" },
    620     { 0x00054, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteBase         , "RIRBUBASE" , "RIRB Upper Base Address" },
    621     { 0x00058, 0x00002, 0x000000FF, 0x00008000, hdaRegReadU8           , hdaRegWriteRIRBWP       , "RIRBWP"    , "RIRB Write Pointer" },
    622     { 0x0005A, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16          , "RINTCNT"   , "Response Interrupt Count" },
    623     { 0x0005C, 0x00001, 0x00000007, 0x00000007, hdaRegReadU8           , hdaRegWriteU8           , "RIRBCTL"   , "RIRB Control" },
    624     { 0x0005D, 0x00001, 0x00000005, 0x00000005, hdaRegReadU8           , hdaRegWriteRIRBSTS      , "RIRBSTS"   , "RIRB Status" },
    625     { 0x0005E, 0x00001, 0x000000F3, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimplemented, "RIRBSIZE"  , "RIRB Size" },
    626     { 0x00060, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "IC"        , "Immediate Command" },
    627     { 0x00064, 0x00004, 0x00000000, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteUnimplemented, "IR"        , "Immediate Response" },
    628 #ifdef OLD_REGISTER_TABLE
    629     { 0x00068, 0x00004, 0x00000002, 0x00000002, hdaRegReadIRS          , hdaRegWriteIRS          , "IRS"       , "Immediate Command Status" },
    630 #else /* 18.2.30 as well as the table says 16-bit. Linux accesses it as a 16-bit register. */
    631     { 0x00068, 0x00002, 0x00000002, 0x00000002, hdaRegReadIRS          , hdaRegWriteIRS          , "IRS"       , "Immediate Command Status" },
    632 #endif
    633     { 0x00070, 0x00004, 0xFFFFFFFF, 0xFFFFFF81, hdaRegReadU32          , hdaRegWriteBase         , "DPLBASE"   , "DMA Position Lower Base" },
    634     { 0x00074, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteBase         , "DPUBASE"   , "DMA Position Upper Base" },
    635 
    636     { 0x00080, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "ISD0CTL"  , "Input Stream Descriptor 0 (ICD0) Control" },
    637     { 0x00083, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "ISD0STS"  , "ISD0 Status" },
    638     { 0x00084, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "ISD0LPIB" , "ISD0 Link Position In Buffer" },
    639     { 0x00088, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "ISD0CBL"  , "ISD0 Cyclic Buffer Length" },
    640     { 0x0008C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD0LVI"  , "ISD0 Last Valid Index" },
    641     { 0x0008E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "ISD0FIFOW", "ISD0 FIFO Watermark" },
    642     { 0x00090, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD0FIFOS", "ISD0 FIFO Size" },
    643     { 0x00092, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "ISD0FMT"  , "ISD0 Format" },
    644     { 0x00098, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD0BDPL" , "ISD0 Buffer Descriptor List Pointer-Lower Base Address" },
    645     { 0x0009C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "ISD0BDPU" , "ISD0 Buffer Descriptor List Pointer-Upper Base Address" },
    646 
    647     { 0x000A0, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "ISD1CTL"  , "Input Stream Descriptor 1 (ISD1) Control" },
    648     { 0x000A3, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "ISD1STS"  , "ISD1 Status" },
    649     { 0x000A4, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "ISD1LPIB" , "ISD1 Link Position In Buffer" },
    650     { 0x000A8, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "ISD1CBL"  , "ISD1 Cyclic Buffer Length" },
    651     { 0x000AC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD1LVI"  , "ISD1 Last Valid Index" },
    652     { 0x000AE, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "ISD1FIFOW", "ISD1 FIFO Watermark" },
    653     { 0x000B0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD1FIFOS", "ISD1 FIFO Size" },
    654     { 0x000B2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "ISD1FMT"  , "ISD1 Format" },
    655     { 0x000B8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD1BDPL" , "ISD1 Buffer Descriptor List Pointer-Lower Base Address" },
    656     { 0x000BC, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "ISD1BDPU" , "ISD1 Buffer Descriptor List Pointer-Upper Base Address" },
    657 
    658     { 0x000C0, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "ISD2CTL"  , "Input Stream Descriptor 2 (ISD2) Control" },
    659     { 0x000C3, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "ISD2STS"  , "ISD2 Status" },
    660     { 0x000C4, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "ISD2LPIB" , "ISD2 Link Position In Buffer" },
    661     { 0x000C8, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "ISD2CBL"  , "ISD2 Cyclic Buffer Length" },
    662     { 0x000CC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD2LVI"  , "ISD2 Last Valid Index" },
    663     { 0x000CE, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "ISD2FIFOW", "ISD2 FIFO Watermark" },
    664     { 0x000D0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD2FIFOS", "ISD2 FIFO Size" },
    665     { 0x000D2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "ISD2FMT"  , "ISD2 Format" },
    666     { 0x000D8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD2BDPL" , "ISD2 Buffer Descriptor List Pointer-Lower Base Address" },
    667     { 0x000DC, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "ISD2BDPU" , "ISD2 Buffer Descriptor List Pointer-Upper Base Address" },
    668 
    669     { 0x000E0, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "ISD3CTL"  , "Input Stream Descriptor 3 (ISD3) Control" },
    670     { 0x000E3, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "ISD3STS"  , "ISD3 Status" },
    671     { 0x000E4, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "ISD3LPIB" , "ISD3 Link Position In Buffer" },
    672     { 0x000E8, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "ISD3CBL"  , "ISD3 Cyclic Buffer Length" },
    673     { 0x000EC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "ISD3LVI"  , "ISD3 Last Valid Index" },
    674     { 0x000EE, 0x00002, 0x00000005, 0x00000005, hdaRegReadU16          , hdaRegWriteU16          , "ISD3FIFOW", "ISD3 FIFO Watermark" },
    675     { 0x000F0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16          , "ISD3FIFOS", "ISD3 FIFO Size" },
    676     { 0x000F2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "ISD3FMT"  , "ISD3 Format" },
    677     { 0x000F8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "ISD3BDPL" , "ISD3 Buffer Descriptor List Pointer-Lower Base Address" },
    678     { 0x000FC, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "ISD3BDPU" , "ISD3 Buffer Descriptor List Pointer-Upper Base Address" },
    679 
    680     { 0x00100, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadSDCTL        , hdaRegWriteSDCTL        , "OSD0CTL"  , "Input Stream Descriptor 0 (OSD0) Control" },
    681     { 0x00103, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "OSD0STS"  , "OSD0 Status" },
    682     { 0x00104, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "OSD0LPIB" , "OSD0 Link Position In Buffer" },
    683     { 0x00108, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "OSD0CBL"  , "OSD0 Cyclic Buffer Length" },
    684     { 0x0010C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD0LVI"  , "OSD0 Last Valid Index" },
    685     { 0x0010E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "OSD0FIFOW", "OSD0 FIFO Watermark" },
    686     { 0x00110, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD0FIFOS", "OSD0 FIFO Size" },
    687     { 0x00112, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "OSD0FMT"  , "OSD0 Format" },
    688     { 0x00118, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD0BDPL" , "OSD0 Buffer Descriptor List Pointer-Lower Base Address" },
    689     { 0x0011C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "OSD0BDPU" , "OSD0 Buffer Descriptor List Pointer-Upper Base Address" },
    690 
    691     { 0x00120, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "OSD1CTL"  , "Input Stream Descriptor 0 (OSD1) Control" },
    692     { 0x00123, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "OSD1STS"  , "OSD1 Status" },
    693     { 0x00124, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "OSD1LPIB" , "OSD1 Link Position In Buffer" },
    694     { 0x00128, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "OSD1CBL"  , "OSD1 Cyclic Buffer Length" },
    695     { 0x0012C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD1LVI"  , "OSD1 Last Valid Index" },
    696     { 0x0012E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "OSD1FIFOW", "OSD1 FIFO Watermark" },
    697     { 0x00130, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD1FIFOS", "OSD1 FIFO Size" },
    698     { 0x00132, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "OSD1FMT"  , "OSD1 Format" },
    699     { 0x00138, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD1BDPL" , "OSD1 Buffer Descriptor List Pointer-Lower Base Address" },
    700     { 0x0013C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "OSD1BDPU" , "OSD1 Buffer Descriptor List Pointer-Upper Base Address" },
    701 
    702     { 0x00140, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "OSD2CTL"  , "Input Stream Descriptor 0 (OSD2) Control" },
    703     { 0x00143, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "OSD2STS"  , "OSD2 Status" },
    704     { 0x00144, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "OSD2LPIB" , "OSD2 Link Position In Buffer" },
    705     { 0x00148, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "OSD2CBL"  , "OSD2 Cyclic Buffer Length" },
    706     { 0x0014C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD2LVI"  , "OSD2 Last Valid Index" },
    707     { 0x0014E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "OSD2FIFOW", "OSD2 FIFO Watermark" },
    708     { 0x00150, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD2FIFOS", "OSD2 FIFO Size" },
    709     { 0x00152, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "OSD2FMT"  , "OSD2 Format" },
    710     { 0x00158, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD2BDPL" , "OSD2 Buffer Descriptor List Pointer-Lower Base Address" },
    711     { 0x0015C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "OSD2BDPU" , "OSD2 Buffer Descriptor List Pointer-Upper Base Address" },
    712 
    713     { 0x00160, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL        , "OSD3CTL"  , "Input Stream Descriptor 0 (OSD3) Control" },
    714     { 0x00163, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS        , "OSD3STS"  , "OSD3 Status" },
    715     { 0x00164, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32          , "OSD3LPIB" , "OSD3 Link Position In Buffer" },
    716     { 0x00168, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32          , "OSD3CBL"  , "OSD3 Cyclic Buffer Length" },
    717     { 0x0016C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI        , "OSD3LVI"  , "OSD3 Last Valid Index" },
    718     { 0x0016E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW      , "OSD3FIFOW", "OSD3 FIFO Watermark" },
    719     { 0x00170, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS      , "OSD3FIFOS", "OSD3 FIFO Size" },
    720     { 0x00172, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT        , "OSD3FMT"  , "OSD3 Format" },
    721     { 0x00178, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL       , "OSD3BDPL" , "OSD3 Buffer Descriptor List Pointer-Lower Base Address" },
    722     { 0x0017C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU       , "OSD3BDPU" , "OSD3 Buffer Descriptor List Pointer-Upper Base Address" },
     698    { 0x00034, 0x00004, 0x000000FF, 0x000000FF, hdaRegReadU32          , hdaRegWriteU32        , RA(SSYNC)     }, /* Stream Synchronization */
     699    { 0x00040, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteBase       , RA(CORBLBASE) }, /* CORB Lower Base Address */
     700    { 0x00044, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteBase       , RA(CORBUBASE) }, /* CORB Upper Base Address */
     701    { 0x00048, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteCORBWP     , RA(CORBWP)    }, /* CORB Write Pointer */
     702    { 0x0004A, 0x00002, 0x000080FF, 0x000080FF, hdaRegReadU16          , hdaRegWriteCORBRP     , RA(CORBRP)    }, /* CORB Read Pointer */
     703    { 0x0004C, 0x00001, 0x00000003, 0x00000003, hdaRegReadU8           , hdaRegWriteCORBCTL    , RA(CORBCTL)   }, /* CORB Control */
     704    { 0x0004D, 0x00001, 0x00000001, 0x00000001, hdaRegReadU8           , hdaRegWriteCORBSTS    , RA(CORBSTS)   }, /* CORB Status */
     705    { 0x0004E, 0x00001, 0x000000F3, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimpl     , RA(CORBSIZE)  }, /* CORB Size */
     706    { 0x00050, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteBase       , RA(RIRBLBASE) }, /* RIRB Lower Base Address */
     707    { 0x00054, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteBase       , RA(RIRBUBASE) }, /* RIRB Upper Base Address */
     708    { 0x00058, 0x00002, 0x000000FF, 0x00008000, hdaRegReadU8           , hdaRegWriteRIRBWP     , RA(RIRBWP)    }, /* RIRB Write Pointer */
     709    { 0x0005A, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteU16        , RA(RINTCNT)   }, /* Response Interrupt Count */
     710    { 0x0005C, 0x00001, 0x00000007, 0x00000007, hdaRegReadU8           , hdaRegWriteU8         , RA(RIRBCTL)   }, /* RIRB Control */
     711    { 0x0005D, 0x00001, 0x00000005, 0x00000005, hdaRegReadU8           , hdaRegWriteRIRBSTS    , RA(RIRBSTS)   }, /* RIRB Status */
     712    { 0x0005E, 0x00001, 0x000000F3, 0x00000000, hdaRegReadU8           , hdaRegWriteUnimpl     , RA(RIRBSIZE)  }, /* RIRB Size */
     713    { 0x00060, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , RA(IC)        }, /* Immediate Command */
     714    { 0x00064, 0x00004, 0x00000000, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteUnimpl     , RA(IR)        }, /* Immediate Response */
     715    { 0x00068, 0x00002, 0x00000002, 0x00000002, hdaRegReadIRS          , hdaRegWriteIRS        , RA(IRS)       }, /* Immediate Command Status */
     716    { 0x00070, 0x00004, 0xFFFFFFFF, 0xFFFFFF81, hdaRegReadU32          , hdaRegWriteBase       , RA(DPLBASE)   }, /* MA Position Lower Base */
     717    { 0x00074, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteBase       , RA(DPUBASE)   }, /* DMA Position Upper Base */
     718
     719    { 0x00080, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , IA(SD0CTL)    }, /* Input Stream Descriptor 0 (ICD0) Control */
     720    { 0x00083, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , IA(SD0STS)    }, /* ISD0 Status */
     721    { 0x00084, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , IA(SD0LPIB)   }, /* ISD0 Link Position In Buffer */
     722    { 0x00088, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , IA(SD0CBL)    }, /* ISD0 Cyclic Buffer Length */
     723    { 0x0008C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , IA(SD0LVI)    }, /* ISD0 Last Valid Index */
     724    { 0x0008E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , IA(SD0FIFOW)  }, /* ISD0 FIFO Watermark */
     725    { 0x00090, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16        , IA(SD0FIFOS)  }, /* ISD0 FIFO Size */
     726    { 0x00092, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , IA(SD0FMT)    }, /* ISD0 Format */
     727    { 0x00098, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , IA(SD0BDPL)   }, /* ISD0 Buffer Descriptor List Pointer-Lower Base Address */
     728    { 0x0009C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , IA(SD0BDPU)   }, /* ISD0 Buffer Descriptor List Pointer-Upper Base Address */
     729
     730    { 0x000A0, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , IA(SD1CTL)    }, /* Input Stream Descriptor 1 (ISD1) Control */
     731    { 0x000A3, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , IA(SD1STS)    }, /* ISD1 Status */
     732    { 0x000A4, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , IA(SD1LPIB)   }, /* ISD1 Link Position In Buffer */
     733    { 0x000A8, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , IA(SD1CBL)    }, /* ISD1 Cyclic Buffer Length */
     734    { 0x000AC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , IA(SD1LVI)    }, /* ISD1 Last Valid Index */
     735    { 0x000AE, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , IA(SD1FIFOW)  }, /* ISD1 FIFO Watermark */
     736    { 0x000B0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16        , IA(SD1FIFOS)  }, /* ISD1 FIFO Size */
     737    { 0x000B2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , IA(SD1FMT)    }, /* ISD1 Format */
     738    { 0x000B8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , IA(SD1BDPL)   }, /* ISD1 Buffer Descriptor List Pointer-Lower Base Address */
     739    { 0x000BC, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , IA(SD1BDPU)   }, /* ISD1 Buffer Descriptor List Pointer-Upper Base Address */
     740
     741    { 0x000C0, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , IA(SD2CTL)    }, /* Input Stream Descriptor 2 (ISD2) Control */
     742    { 0x000C3, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , IA(SD2STS)    }, /* ISD2 Status */
     743    { 0x000C4, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , IA(SD2LPIB)   }, /* ISD2 Link Position In Buffer */
     744    { 0x000C8, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , IA(SD2CBL)    }, /* ISD2 Cyclic Buffer Length */
     745    { 0x000CC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , IA(SD2LVI)    }, /* ISD2 Last Valid Index */
     746    { 0x000CE, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , IA(SD2FIFOW)  }, /* ISD2 FIFO Watermark */
     747    { 0x000D0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16        , IA(SD2FIFOS)  }, /* ISD2 FIFO Size */
     748    { 0x000D2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , IA(SD2FMT)    }, /* ISD2 Format */
     749    { 0x000D8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , IA(SD2BDPL)   }, /* ISD2 Buffer Descriptor List Pointer-Lower Base Address */
     750    { 0x000DC, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , IA(SD2BDPU)   }, /* ISD2 Buffer Descriptor List Pointer-Upper Base Address */
     751
     752    { 0x000E0, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , IA(SD3CTL)    }, /* Input Stream Descriptor 3 (ISD3) Control */
     753    { 0x000E3, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , IA(SD3STS)    }, /* ISD3 Status */
     754    { 0x000E4, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , IA(SD3LPIB)   }, /* ISD3 Link Position In Buffer */
     755    { 0x000E8, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , IA(SD3CBL)    }, /* ISD3 Cyclic Buffer Length */
     756    { 0x000EC, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , IA(SD3LVI)    }, /* ISD3 Last Valid Index */
     757    { 0x000EE, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , IA(SD3FIFOW)  }, /* ISD3 FIFO Watermark */
     758    { 0x000F0, 0x00002, 0x000000FF, 0x00000000, hdaRegReadU16          , hdaRegWriteU16        , IA(SD3FIFOS)  }, /* ISD3 FIFO Size */
     759    { 0x000F2, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , IA(SD3FMT)    }, /* ISD3 Format */
     760    { 0x000F8, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , IA(SD3BDPL)   }, /* ISD3 Buffer Descriptor List Pointer-Lower Base Address */
     761    { 0x000FC, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , IA(SD3BDPU)   }, /* ISD3 Buffer Descriptor List Pointer-Upper Base Address */
     762
     763    { 0x00100, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , OA(SD4CTL)    }, /* Output Stream Descriptor 0 (OSD0) Control */
     764    { 0x00103, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , OA(SD4STS)    }, /* OSD0 Status */
     765    { 0x00104, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , OA(SD4LPIB)   }, /* OSD0 Link Position In Buffer */
     766    { 0x00108, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , OA(SD4CBL)    }, /* OSD0 Cyclic Buffer Length */
     767    { 0x0010C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , OA(SD4LVI)    }, /* OSD0 Last Valid Index */
     768    { 0x0010E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , OA(SD4FIFOW)  }, /* OSD0 FIFO Watermark */
     769    { 0x00110, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS    , OA(SD4FIFOS)  }, /* OSD0 FIFO Size */
     770    { 0x00112, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , OA(SD4FMT)    }, /* OSD0 Format */
     771    { 0x00118, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , OA(SD4BDPL)   }, /* OSD0 Buffer Descriptor List Pointer-Lower Base Address */
     772    { 0x0011C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , OA(SD4BDPU)   }, /* OSD0 Buffer Descriptor List Pointer-Upper Base Address */
     773
     774    { 0x00120, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , OA(SD5CTL)    }, /* Output Stream Descriptor 0 (OSD1) Control */
     775    { 0x00123, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , OA(SD5STS)    }, /* OSD1 Status */
     776    { 0x00124, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , OA(SD5LPIB)   }, /* OSD1 Link Position In Buffer */
     777    { 0x00128, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , OA(SD5CBL)    }, /* OSD1 Cyclic Buffer Length */
     778    { 0x0012C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , OA(SD5LVI)    }, /* OSD1 Last Valid Index */
     779    { 0x0012E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , OA(SD5FIFOW)  }, /* OSD1 FIFO Watermark */
     780    { 0x00130, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS    , OA(SD5FIFOS)  }, /* OSD1 FIFO Size */
     781    { 0x00132, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , OA(SD5FMT)    }, /* OSD1 Format */
     782    { 0x00138, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , OA(SD5BDPL)   }, /* OSD1 Buffer Descriptor List Pointer-Lower Base Address */
     783    { 0x0013C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , OA(SD5BDPU)   }, /* OSD1 Buffer Descriptor List Pointer-Upper Base Address */
     784
     785    { 0x00140, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , OA(SD6CTL)    }, /* Output Stream Descriptor 0 (OSD2) Control */
     786    { 0x00143, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , OA(SD6STS)    }, /* OSD2 Status */
     787    { 0x00144, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , OA(SD6LPIB)   }, /* OSD2 Link Position In Buffer */
     788    { 0x00148, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , OA(SD6CBL)    }, /* OSD2 Cyclic Buffer Length */
     789    { 0x0014C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , OA(SD6LVI)    }, /* OSD2 Last Valid Index */
     790    { 0x0014E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , OA(SD6FIFOW)  }, /* OSD2 FIFO Watermark */
     791    { 0x00150, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS    , OA(SD6FIFOS)  }, /* OSD2 FIFO Size */
     792    { 0x00152, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , OA(SD6FMT)    }, /* OSD2 Format */
     793    { 0x00158, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , OA(SD6BDPL)   }, /* OSD2 Buffer Descriptor List Pointer-Lower Base Address */
     794    { 0x0015C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , OA(SD6BDPU)   }, /* OSD2 Buffer Descriptor List Pointer-Upper Base Address */
     795
     796    { 0x00160, 0x00003, 0x00FF001F, 0x00F0001F, hdaRegReadU24          , hdaRegWriteSDCTL      , OA(SD7CTL)    }, /* Output Stream Descriptor 0 (OSD3) Control */
     797    { 0x00163, 0x00001, 0x0000001C, 0x0000003C, hdaRegReadU8           , hdaRegWriteSDSTS      , OA(SD7STS)    }, /* OSD3 Status */
     798    { 0x00164, 0x00004, 0xFFFFFFFF, 0x00000000, hdaRegReadU32          , hdaRegWriteU32        , OA(SD7LPIB)   }, /* OSD3 Link Position In Buffer */
     799    { 0x00168, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteU32        , OA(SD7CBL)    }, /* OSD3 Cyclic Buffer Length */
     800    { 0x0016C, 0x00002, 0x0000FFFF, 0x0000FFFF, hdaRegReadU16          , hdaRegWriteSDLVI      , OA(SD7LVI)    }, /* OSD3 Last Valid Index */
     801    { 0x0016E, 0x00002, 0x00000007, 0x00000007, hdaRegReadU16          , hdaRegWriteSDFIFOW    , OA(SD7FIFOW)  }, /* OSD3 FIFO Watermark */
     802    { 0x00170, 0x00002, 0x000000FF, 0x000000FF, hdaRegReadU16          , hdaRegWriteSDFIFOS    , OA(SD7FIFOS)  }, /* OSD3 FIFO Size */
     803    { 0x00172, 0x00002, 0x00007F7F, 0x00007F7F, hdaRegReadU16          , hdaRegWriteSDFMT      , OA(SD7FMT)    }, /* OSD3 Format */
     804    { 0x00178, 0x00004, 0xFFFFFF80, 0xFFFFFF80, hdaRegReadU32          , hdaRegWriteSDBDPL     , OA(SD7BDPL)   }, /* OSD3 Buffer Descriptor List Pointer-Lower Base Address */
     805    { 0x0017C, 0x00004, 0xFFFFFFFF, 0xFFFFFFFF, hdaRegReadU32          , hdaRegWriteSDBDPU     , OA(SD7BDPU)   }, /* OSD3 Buffer Descriptor List Pointer-Upper Base Address */
    723806};
    724807
     
    735818} g_aHdaRegAliases[] =
    736819{
    737     { 0x2084, HDA_REG_IND_NAME(SD0LPIB) },
    738     { 0x20a4, HDA_REG_IND_NAME(SD1LPIB) },
    739     { 0x20c4, HDA_REG_IND_NAME(SD2LPIB) },
    740     { 0x20e4, HDA_REG_IND_NAME(SD3LPIB) },
    741     { 0x2104, HDA_REG_IND_NAME(SD4LPIB) },
    742     { 0x2124, HDA_REG_IND_NAME(SD5LPIB) },
    743     { 0x2144, HDA_REG_IND_NAME(SD6LPIB) },
    744     { 0x2164, HDA_REG_IND_NAME(SD7LPIB) },
     820    { 0x2084, HDA_REG_SD0LPIB },
     821    { 0x20a4, HDA_REG_SD1LPIB },
     822    { 0x20c4, HDA_REG_SD2LPIB },
     823    { 0x20e4, HDA_REG_SD3LPIB },
     824    { 0x2104, HDA_REG_SD4LPIB },
     825    { 0x2124, HDA_REG_SD5LPIB },
     826    { 0x2144, HDA_REG_SD6LPIB },
     827    { 0x2164, HDA_REG_SD7LPIB },
    745828};
    746829
     
    797880{
    798881#if 0
    799     switch(HDA_STREAM_REG2(pThis, FIFOW, pStreamDesc->u8Strm))
     882    switch(HDA_STREAM_REG(pThis, FIFOW, pStreamDesc->u8Strm))
    800883    {
    801884        case HDA_SDFIFOW_8B: return 8;
     
    815898         && (SDSTS(pThis, num) & HDA_REG_FIELD_FLAG_MASK(SDSTS, BCIS)))
    816899    bool fIrq = false;
    817     if (   INTCTL_CIE(pThis)
    818        && (   RIRBSTS_RINTFL(pThis)
    819            || RIRBSTS_RIRBOIS(pThis)
    820            || (STATESTS(pThis) & WAKEEN(pThis))))
     900    if (   HDA_REG_FLAG_VALUE(pThis, INTCTL, CIE)
     901       && (   HDA_REG_FLAG_VALUE(pThis, RIRBSTS, RINTFL)
     902           || HDA_REG_FLAG_VALUE(pThis, RIRBSTS, RIRBOIS)
     903           || (HDA_REG(pThis, STATESTS) & HDA_REG(pThis, WAKEEN))))
    821904        fIrq = true;
    822905
     
    825908        fIrq = true;
    826909
    827     if (INTCTL_GIE(pThis))
     910    if (HDA_REG_FLAG_VALUE(pThis, INTCTL, GIE))
    828911    {
    829912        Log(("hda: irq %s\n", fIrq ? "asserted" : "deasserted"));
     
    9591042            {
    9601043                const char *prefix;
    961                 if ((i + j) == CORBRP(pThis))
     1044                if ((i + j) == HDA_REG(pThis, CORBRP);
    9621045                    prefix = "[R]";
    963                 else if ((i + j) == CORBWP(pThis))
     1046                else if ((i + j) == HDA_REG(pThis, CORBWP);
    9641047                    prefix = "[W]";
    9651048                else
     
    9861069            do {
    9871070                const char *prefix;
    988                 if ((i + j) == RIRBWP(pThis))
     1071                if ((i + j) == HDA_REG(pThis, RIRBWP))
    9891072                    prefix = "[W]";
    9901073                else
     
    10121095    if (RT_FAILURE(rc))
    10131096        AssertRCReturn(rc, rc);
    1014     corbRp = CORBRP(pThis);
    1015     corbWp = CORBWP(pThis);
    1016     rirbWp = RIRBWP(pThis);
     1097    corbRp = HDA_REG(pThis, CORBRP);
     1098    corbWp = HDA_REG(pThis, CORBWP);
     1099    rirbWp = HDA_REG(pThis, RIRBWP);
    10171100    Assert((corbWp != corbRp));
    1018     Log(("hda: CORB(RP:%x, WP:%x) RIRBWP:%x\n", CORBRP(pThis), CORBWP(pThis), RIRBWP(pThis)));
     1101    Log(("hda: CORB(RP:%x, WP:%x) RIRBWP:%x\n", HDA_REG(pThis, CORBRP),
     1102         HDA_REG(pThis, CORBWP), HDA_REG(pThis, RIRBWP)));
    10191103    while (corbRp != corbWp)
    10201104    {
     
    10421126        {
    10431127            Log(("hda: unexpected unsolicited response.\n"));
    1044             pThis->au32Regs[HDA_REG_CORBRP] = corbRp;
     1128            HDA_REG(pThis, CORBRP) = corbRp;
    10451129            return rc;
    10461130        }
     
    10501134            break;
    10511135    }
    1052     pThis->au32Regs[HDA_REG_CORBRP] = corbRp;
    1053     pThis->au32Regs[HDA_REG_RIRBWP] = rirbWp;
     1136    HDA_REG(pThis, CORBRP) = corbRp;
     1137    HDA_REG(pThis, RIRBWP) = rirbWp;
    10541138    rc = hdaCmdSync(pThis, false);
    1055     Log(("hda: CORB(RP:%x, WP:%x) RIRBWP:%x\n", CORBRP(pThis), CORBWP(pThis), RIRBWP(pThis)));
    1056     if (RIRBCTL_RIRB_RIC(pThis))
    1057     {
    1058         RIRBSTS((pThis)) |= HDA_REG_FIELD_FLAG_MASK(RIRBSTS,RINTFL);
     1139    Log(("hda: CORB(RP:%x, WP:%x) RIRBWP:%x\n", HDA_REG(pThis, CORBRP),
     1140         HDA_REG(pThis, CORBWP), HDA_REG(pThis, RIRBWP)));
     1141    if (HDA_REG_FLAG_VALUE(pThis, RIRBCTL, RIC))
     1142    {
     1143        HDA_REG(pThis, RIRBSTS) |= HDA_REG_FIELD_FLAG_MASK(RIRBSTS,RINTFL);
    10591144        pThis->u8Counter = 0;
    10601145        rc = hdaProcessInterrupt(pThis);
     
    10781163    /* According to the ICH6 datasheet, 0x40000 is the default value for stream descriptor register 23:20
    10791164     * bits are reserved for stream number 18.2.33, resets SDnCTL except SRCT bit */
    1080     HDA_STREAM_REG2(pThis, CTL, u8Strm) = 0x40000 | (HDA_STREAM_REG2(pThis, CTL, u8Strm) & HDA_REG_FIELD_FLAG_MASK(SDCTL, SRST));
     1165    HDA_STREAM_REG(pThis, CTL, u8Strm) = 0x40000 | (HDA_STREAM_REG(pThis, CTL, u8Strm) & HDA_REG_FIELD_FLAG_MASK(SDCTL, SRST));
    10811166
    10821167    /* ICH6 defines default values (0x77 for input and 0xBF for output descriptors) of FIFO size. 18.2.39 */
    1083     HDA_STREAM_REG2(pThis, FIFOS, u8Strm) =  u8Strm < 4 ? HDA_SDINFIFO_120B : HDA_SDONFIFO_192B;
    1084     HDA_STREAM_REG2(pThis, FIFOW, u8Strm) = u8Strm < 4 ? HDA_SDFIFOW_8B : HDA_SDFIFOW_32B;
    1085     HDA_STREAM_REG2(pThis, CBL, u8Strm) = 0;
    1086     HDA_STREAM_REG2(pThis, LVI, u8Strm) = 0;
    1087     HDA_STREAM_REG2(pThis, FMT, u8Strm) = 0;
    1088     HDA_STREAM_REG2(pThis, BDPU, u8Strm) = 0;
    1089     HDA_STREAM_REG2(pThis, BDPL, u8Strm) = 0;
     1168    HDA_STREAM_REG(pThis, FIFOS, u8Strm) =  u8Strm < 4 ? HDA_SDINFIFO_120B : HDA_SDONFIFO_192B;
     1169    HDA_STREAM_REG(pThis, FIFOW, u8Strm) = u8Strm < 4 ? HDA_SDFIFOW_8B : HDA_SDFIFOW_32B;
     1170    HDA_STREAM_REG(pThis, CBL, u8Strm) = 0;
     1171    HDA_STREAM_REG(pThis, LVI, u8Strm) = 0;
     1172    HDA_STREAM_REG(pThis, FMT, u8Strm) = 0;
     1173    HDA_STREAM_REG(pThis, BDPU, u8Strm) = 0;
     1174    HDA_STREAM_REG(pThis, BDPL, u8Strm) = 0;
    10901175    Log(("hda: reset of stream (%d) finished\n", u8Strm));
    10911176}
     
    10931178/* Register access handlers. */
    10941179
    1095 static int hdaRegReadUnimplemented(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
     1180static int hdaRegReadUnimpl(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    10961181{
    10971182    *pu32Value = 0;
     
    10991184}
    11001185
    1101 static int hdaRegWriteUnimplemented(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
     1186static int hdaRegWriteUnimpl(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    11021187{
    11031188    return VINF_SUCCESS;
     
    11071192static int hdaRegReadU8(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    11081193{
    1109     Assert(((pThis->au32Regs[iReg] & g_aHdaRegMap[iReg].readable) & 0xffffff00) == 0);
     1194    Assert(((pThis->au32Regs[g_aHdaRegMap[iReg].mem_idx] & g_aHdaRegMap[iReg].readable) & 0xffffff00) == 0);
    11101195    return hdaRegReadU32(pThis, iReg, pu32Value);
    11111196}
     
    11201205static int hdaRegReadU16(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    11211206{
    1122     Assert(((pThis->au32Regs[iReg] & g_aHdaRegMap[iReg].readable) & 0xffff0000) == 0);
     1207    Assert(((pThis->au32Regs[g_aHdaRegMap[iReg].mem_idx] & g_aHdaRegMap[iReg].readable) & 0xffff0000) == 0);
    11231208    return hdaRegReadU32(pThis, iReg, pu32Value);
    11241209}
     
    11331218static int hdaRegReadU24(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    11341219{
    1135     Assert(((pThis->au32Regs[iReg] & g_aHdaRegMap[iReg].readable) & 0xff000000) == 0);
     1220    Assert(((pThis->au32Regs[g_aHdaRegMap[iReg].mem_idx] & g_aHdaRegMap[iReg].readable) & 0xff000000) == 0);
    11361221    return hdaRegReadU32(pThis, iReg, pu32Value);
    11371222}
     
    11461231static int hdaRegReadU32(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    11471232{
    1148     *pu32Value = pThis->au32Regs[iReg] & g_aHdaRegMap[iReg].readable;
     1233    uint32_t    iRegMem = g_aHdaRegMap[iReg].mem_idx;
     1234
     1235    *pu32Value = pThis->au32Regs[iRegMem] & g_aHdaRegMap[iReg].readable;
    11491236    return VINF_SUCCESS;
    11501237}
     
    11521239static int hdaRegWriteU32(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    11531240{
    1154     pThis->au32Regs[iReg]  = (u32Value & g_aHdaRegMap[iReg].writable)
    1155                            | (pThis->au32Regs[iReg] & ~g_aHdaRegMap[iReg].writable);
     1241    uint32_t    iRegMem = g_aHdaRegMap[iReg].mem_idx;
     1242
     1243    pThis->au32Regs[iRegMem]  = (u32Value & g_aHdaRegMap[iReg].writable)
     1244                              | (pThis->au32Regs[iRegMem] & ~g_aHdaRegMap[iReg].writable);
    11561245    return VINF_SUCCESS;
    11571246}
    11581247
    1159 static int hdaRegReadGCTL(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    1160 {
    1161     return hdaRegReadU32(pThis, iReg, pu32Value);
    1162 }
    1163 
    11641248static int hdaRegWriteGCTL(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    11651249{
     
    11671251    {
    11681252        /* exit reset state */
    1169         GCTL(pThis) |= HDA_REG_FIELD_FLAG_MASK(GCTL, RST);
     1253        HDA_REG(pThis, GCTL) |= HDA_REG_FIELD_FLAG_MASK(GCTL, RST);
    11701254        pThis->fInReset = false;
    11711255    }
     
    11821266        }
    11831267        hdaReset(pThis->CTX_SUFF(pDevIns));
    1184         GCTL(pThis) &= ~HDA_REG_FIELD_FLAG_MASK(GCTL, RST);
     1268        HDA_REG(pThis, GCTL) &= ~HDA_REG_FIELD_FLAG_MASK(GCTL, RST);
    11851269        pThis->fInReset = true;
    11861270#else
     
    11911275    {
    11921276        /* Flush: GSTS:1 set,  see 6.2.6*/
    1193         GSTS(pThis) |= HDA_REG_FIELD_FLAG_MASK(GSTS, FSH); /* set the flush state */
     1277        HDA_REG(pThis, GSTS) |= HDA_REG_FIELD_FLAG_MASK(GSTS, FSH); /* set the flush state */
    11941278        /* DPLBASE and DPUBASE should be initialized with initial value (see 6.2.6)*/
    11951279    }
     
    11991283static int hdaRegWriteSTATESTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    12001284{
    1201     uint32_t v = pThis->au32Regs[iReg];
     1285    uint32_t iRegMem = g_aHdaRegMap[iReg].mem_idx;
     1286
     1287    uint32_t v = pThis->au32Regs[iRegMem];
    12021288    uint32_t nv = u32Value & HDA_STATES_SCSF;
    1203     pThis->au32Regs[iReg] &= ~(v & nv); /* write of 1 clears corresponding bit */
     1289    pThis->au32Regs[iRegMem] &= ~(v & nv); /* write of 1 clears corresponding bit */
    12041290    return VINF_SUCCESS;
    12051291}
     
    12081294{
    12091295    uint32_t v = 0;
    1210     if (   RIRBSTS_RIRBOIS(pThis)
    1211         || RIRBSTS_RINTFL(pThis)
     1296    if (   HDA_REG_FLAG_VALUE(pThis, RIRBSTS, RIRBOIS)
     1297        || HDA_REG_FLAG_VALUE(pThis, RIRBSTS, RINTFL)
    12121298        || HDA_REG_FLAG_VALUE(pThis, CORBSTS, CMEI)
    1213         || STATESTS(pThis))
     1299        || HDA_REG(pThis, STATESTS))
    12141300        v |= RT_BIT(30);
    12151301#define HDA_IS_STREAM_EVENT(pThis, stream)             \
     
    12391325}
    12401326
    1241 static int hdaRegReadGCAP(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    1242 {
    1243     return hdaRegReadU16(pThis, iReg, pu32Value);
    1244 }
    1245 
    12461327static int hdaRegWriteCORBRP(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    12471328{
    12481329    if (u32Value & HDA_REG_FIELD_FLAG_MASK(CORBRP, RST))
    1249         CORBRP(pThis) = 0;
     1330        HDA_REG(pThis, CORBRP) = 0;
    12501331#ifndef BIRD_THINKS_CORBRP_IS_MOSTLY_RO
    12511332    else
     
    12601341    int rc = hdaRegWriteU8(pThis, iReg, u32Value);
    12611342    AssertRC(rc);
    1262     if (   CORBWP(pThis) != CORBRP(pThis)
     1343    if (   HDA_REG(pThis, CORBWP) != HDA_REG(pThis, CORBRP)
    12631344        && HDA_REG_FLAG_VALUE(pThis, CORBCTL, DMA) != 0)
    12641345        return hdaCORBCmdProcess(pThis);
     
    12711352static int hdaRegWriteCORBSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    12721353{
    1273     uint32_t v = CORBSTS(pThis);
    1274     CORBSTS(pThis) &= ~(v & u32Value);
     1354    uint32_t v = HDA_REG(pThis, CORBSTS);
     1355    HDA_REG(pThis, CORBSTS) &= ~(v & u32Value);
    12751356    return VINF_SUCCESS;
    12761357}
     
    12831364    if (RT_FAILURE(rc))
    12841365        AssertRCReturn(rc, rc);
    1285     if (CORBWP(pThis) == CORBRP(pThis))
     1366    if (HDA_REG(pThis, CORBWP) == HDA_REG(pThis, CORBRP))
    12861367        return VINF_SUCCESS;
    12871368    if (!HDA_REG_FLAG_VALUE(pThis, CORBCTL, DMA))
     
    12921373    return VINF_IOM_R3_MMIO_WRITE;
    12931374#endif
    1294 }
    1295 
    1296 static int hdaRegReadSDCTL(PHDASTATE pThis, uint32_t iReg, uint32_t *pu32Value)
    1297 {
    1298     return hdaRegReadU24(pThis, iReg, pu32Value);
    12991375}
    13001376
     
    15591635    int rc = VINF_SUCCESS;
    15601636    /* regarding 3.4.3 we should mark IRS as busy in case CORB is active */
    1561     if (   CORBWP(pThis) != CORBRP(pThis)
     1637    if (   HDA_REG(pThis, CORBWP) != HDA_REG(pThis, CORBRP)
    15621638        || HDA_REG_FLAG_VALUE(pThis, CORBCTL, DMA))
    1563         IRS(pThis) = HDA_REG_FIELD_FLAG_MASK(IRS, ICB);  /* busy */
     1639        HDA_REG(pThis, IRS) = HDA_REG_FIELD_FLAG_MASK(IRS, ICB);  /* busy */
    15641640
    15651641    rc = hdaRegReadU32(pThis, iReg, pu32Value);
     
    15761652     */
    15771653    if (   u32Value & HDA_REG_FIELD_FLAG_MASK(IRS, ICB)
    1578         && !IRS_ICB(pThis))
     1654        && !HDA_REG_FLAG_VALUE(pThis, IRS, ICB))
    15791655    {
    15801656#ifdef IN_RING3
    15811657        PFNHDACODECVERBPROCESSOR    pfn = NULL;
    15821658        uint64_t                    resp;
    1583         uint32_t cmd = IC(pThis);
    1584         if (CORBWP(pThis) != CORBRP(pThis))
     1659        uint32_t cmd = HDA_REG(pThis, IC);
     1660        if (HDA_REG(pThis, CORBWP) != HDA_REG(pThis, CORBRP))
    15851661        {
    15861662            /*
     
    15901666            return rc;
    15911667        }
    1592         IRS(pThis) = HDA_REG_FIELD_FLAG_MASK(IRS, ICB);  /* busy */
     1668        HDA_REG(pThis, IRS) = HDA_REG_FIELD_FLAG_MASK(IRS, ICB);  /* busy */
    15931669        Log(("hda: IC:%x\n", cmd));
    15941670        rc = pThis->pCodec->pfnLookup(pThis->pCodec, cmd, &pfn);
     
    15981674        if (RT_FAILURE(rc))
    15991675            AssertRCReturn(rc, rc);
    1600         IR(pThis) = (uint32_t)resp;
    1601         Log(("hda: IR:%x\n", IR(pThis)));
    1602         IRS(pThis) = HDA_REG_FIELD_FLAG_MASK(IRS, IRV);  /* result is ready  */
    1603         IRS(pThis) &= ~HDA_REG_FIELD_FLAG_MASK(IRS, ICB); /* busy is clear */
     1676        HDA_REG(pThis, IR) = (uint32_t)resp;
     1677        Log(("hda: IR:%x\n", HDA_REG(pThis, IR)));
     1678        HDA_REG(pThis, IRS) = HDA_REG_FIELD_FLAG_MASK(IRS, IRV);  /* result is ready  */
     1679        HDA_REG(pThis, IRS) &= ~HDA_REG_FIELD_FLAG_MASK(IRS, ICB); /* busy is clear */
    16041680#else
    16051681        rc = VINF_IOM_R3_MMIO_WRITE;
     
    16111687     */
    16121688    if (   u32Value & HDA_REG_FIELD_FLAG_MASK(IRS, IRV)
    1613         && IRS_IRV(pThis))
    1614         IRS(pThis) &= ~HDA_REG_FIELD_FLAG_MASK(IRS, IRV);
     1689        && HDA_REG_FLAG_VALUE(pThis, IRS, IRV))
     1690        HDA_REG(pThis, IRS) &= ~HDA_REG_FIELD_FLAG_MASK(IRS, IRV);
    16151691    return rc;
    16161692}
     
    16201696    if (u32Value & HDA_REG_FIELD_FLAG_MASK(RIRBWP, RST))
    16211697    {
    1622         RIRBWP(pThis) = 0;
     1698        HDA_REG(pThis, RIRBWP) = 0;
    16231699    }
    16241700    /* The remaining bits are O, see 6.2.22 */
     
    16281704static int hdaRegWriteBase(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    16291705{
     1706    uint32_t iRegMem = g_aHdaRegMap[iReg].mem_idx;
    16301707    int rc = hdaRegWriteU32(pThis, iReg, u32Value);
    16311708    if (RT_FAILURE(rc))
    16321709        AssertRCReturn(rc, rc);
     1710
    16331711    switch(iReg)
    16341712    {
    16351713        case HDA_REG_CORBLBASE:
    16361714            pThis->u64CORBBase &= UINT64_C(0xFFFFFFFF00000000);
    1637             pThis->u64CORBBase |= pThis->au32Regs[iReg];
     1715            pThis->u64CORBBase |= pThis->au32Regs[iRegMem];
    16381716            break;
    16391717        case HDA_REG_CORBUBASE:
    16401718            pThis->u64CORBBase &= UINT64_C(0x00000000FFFFFFFF);
    1641             pThis->u64CORBBase |= ((uint64_t)pThis->au32Regs[iReg] << 32);
     1719            pThis->u64CORBBase |= ((uint64_t)pThis->au32Regs[iRegMem] << 32);
    16421720            break;
    1643         case HDA_REG_RIRLBASE:
     1721        case HDA_REG_RIRBLBASE:
    16441722            pThis->u64RIRBBase &= UINT64_C(0xFFFFFFFF00000000);
    1645             pThis->u64RIRBBase |= pThis->au32Regs[iReg];
     1723            pThis->u64RIRBBase |= pThis->au32Regs[iRegMem];
    16461724            break;
    1647         case HDA_REG_RIRUBASE:
     1725        case HDA_REG_RIRBUBASE:
    16481726            pThis->u64RIRBBase &= UINT64_C(0x00000000FFFFFFFF);
    1649             pThis->u64RIRBBase |= ((uint64_t)pThis->au32Regs[iReg] << 32);
     1727            pThis->u64RIRBBase |= ((uint64_t)pThis->au32Regs[iRegMem] << 32);
    16501728            break;
    16511729        case HDA_REG_DPLBASE:
    16521730            /** @todo: first bit has special meaning */
    16531731            pThis->u64DPBase &= UINT64_C(0xFFFFFFFF00000000);
    1654             pThis->u64DPBase |= pThis->au32Regs[iReg];
     1732            pThis->u64DPBase |= pThis->au32Regs[iRegMem];
    16551733            break;
    16561734        case HDA_REG_DPUBASE:
    16571735            pThis->u64DPBase &= UINT64_C(0x00000000FFFFFFFF);
    1658             pThis->u64DPBase |= ((uint64_t)pThis->au32Regs[iReg] << 32);
     1736            pThis->u64DPBase |= ((uint64_t)pThis->au32Regs[iRegMem] << 32);
    16591737            break;
    16601738        default:
     
    16671745static int hdaRegWriteRIRBSTS(PHDASTATE pThis, uint32_t iReg, uint32_t u32Value)
    16681746{
    1669     uint8_t v = RIRBSTS(pThis);
    1670     RIRBSTS(pThis) &= ~(v & u32Value);
     1747    uint8_t v = HDA_REG(pThis, RIRBSTS);
     1748    HDA_REG(pThis, RIRBSTS) &= ~(v & u32Value);
    16711749
    16721750    return hdaProcessInterrupt(pThis);
     
    19802058    memset(pStreamDesc, 0, sizeof(HDASTREAMTRANSFERDESC));
    19812059    pStreamDesc->u8Strm     = u8Strm;
    1982     pStreamDesc->u32Ctl     = HDA_STREAM_REG2(pThis, CTL, u8Strm);
    1983     pStreamDesc->u64BaseDMA = RT_MAKE_U64(HDA_STREAM_REG2(pThis, BDPL, u8Strm),
    1984                                           HDA_STREAM_REG2(pThis, BDPU, u8Strm));
    1985     pStreamDesc->pu32Lpib   = &HDA_STREAM_REG2(pThis, LPIB, u8Strm);
    1986     pStreamDesc->pu32Sts    = &HDA_STREAM_REG2(pThis, STS, u8Strm);
    1987     pStreamDesc->u32Cbl     = HDA_STREAM_REG2(pThis, CBL, u8Strm);
    1988     pStreamDesc->u32Fifos   = HDA_STREAM_REG2(pThis, FIFOS, u8Strm);
    1989 
    1990     pBdle->u32BdleMaxCvi    = HDA_STREAM_REG2(pThis, LVI, u8Strm);
     2060    pStreamDesc->u32Ctl     = HDA_STREAM_REG(pThis, CTL, u8Strm);
     2061    pStreamDesc->u64BaseDMA = RT_MAKE_U64(HDA_STREAM_REG(pThis, BDPL, u8Strm),
     2062                                          HDA_STREAM_REG(pThis, BDPU, u8Strm));
     2063    pStreamDesc->pu32Lpib   = &HDA_STREAM_REG(pThis, LPIB, u8Strm);
     2064    pStreamDesc->pu32Sts    = &HDA_STREAM_REG(pThis, STS, u8Strm);
     2065    pStreamDesc->u32Cbl     = HDA_STREAM_REG(pThis, CBL, u8Strm);
     2066    pStreamDesc->u32Fifos   = HDA_STREAM_REG(pThis, FIFOS, u8Strm);
     2067
     2068    pBdle->u32BdleMaxCvi    = HDA_STREAM_REG(pThis, LVI, u8Strm);
    19912069
    19922070#ifdef LOG_ENABLED
     
    20892167     */
    20902168    uint32_t        offReg = GCPhysAddr - pThis->MMIOBaseAddr;
    2091     int             idxReg = hdaRegLookup(pThis, offReg);
     2169    int             idxRegDsc = hdaRegLookup(pThis, offReg);    /* Register descriptor index. */
    20922170#ifdef LOG_ENABLED
    20932171    unsigned const  cbLog     = cb;
     
    21002178    Assert(cb == 4); Assert((offReg & 3) == 0);
    21012179
    2102     if (pThis->fInReset && idxReg != HDA_REG_GCTL)
     2180    if (pThis->fInReset && idxRegDsc != HDA_REG_GCTL)
    21032181        Log(("hda: access to registers except GCTL is blocked while reset\n"));
    21042182
    2105     if (idxReg == -1)
     2183    if (idxRegDsc == -1)
    21062184        LogRel(("hda: Invalid read access @0x%x(of bytes:%d)\n", offReg, cb));
    21072185
    2108     if (idxReg != -1)
     2186    if (idxRegDsc != -1)
    21092187    {
    21102188        /* ASSUMES gapless DWORD at end of map. */
    2111         if (g_aHdaRegMap[idxReg].size == 4)
     2189        if (g_aHdaRegMap[idxRegDsc].size == 4)
    21122190        {
    21132191            /*
    21142192             * Straight forward DWORD access.
    21152193             */
    2116             rc = g_aHdaRegMap[idxReg].pfnRead(pThis, idxReg, (uint32_t *)pv);
    2117             Log(("hda: read %s => %x (%Rrc)\n", g_aHdaRegMap[idxReg].abbrev, *(uint32_t *)pv, rc));
     2194            rc = g_aHdaRegMap[idxRegDsc].pfnRead(pThis, idxRegDsc, (uint32_t *)pv);
     2195            Log(("hda: read %s => %x (%Rrc)\n", g_aHdaRegMap[idxRegDsc].abbrev, *(uint32_t *)pv, rc));
    21182196        }
    21192197        else
     
    21272205            do
    21282206            {
    2129                 uint32_t const  cbReg        = g_aHdaRegMap[idxReg].size;
     2207                uint32_t const  cbReg        = g_aHdaRegMap[idxRegDsc].size;
    21302208                uint32_t        u32Tmp       = 0;
    21312209
    2132                 rc = g_aHdaRegMap[idxReg].pfnRead(pThis, idxReg, &u32Tmp);
    2133                 Log(("hda: read %s[%db] => %x (%Rrc)*\n", g_aHdaRegMap[idxReg].abbrev, cbReg, u32Tmp, rc));
     2210                rc = g_aHdaRegMap[idxRegDsc].pfnRead(pThis, idxRegDsc, &u32Tmp);
     2211                Log(("hda: read %s[%db] => %x (%Rrc)*\n", g_aHdaRegMap[idxRegDsc].abbrev, cbReg, u32Tmp, rc));
    21342212                if (rc != VINF_SUCCESS)
    21352213                    break;
     
    21382216                cbLeft -= cbReg;
    21392217                offReg += cbReg;
    2140                 idxReg++;
    2141             } while (cbLeft > 0 && g_aHdaRegMap[idxReg].offset == offReg);
     2218                idxRegDsc++;
     2219            } while (cbLeft > 0 && g_aHdaRegMap[idxRegDsc].offset == offReg);
    21422220
    21432221            if (rc == VINF_SUCCESS)
     
    21532231    }
    21542232#else
    2155     if (idxReg != -1)
     2233    if (idxRegDsc != -1)
    21562234    {
    21572235        /** @todo r=bird: Accesses crossing register boundraries aren't handled
     
    21592237         *        what the rules are. */
    21602238        uint32_t mask = 0;
    2161         uint32_t shift = (g_aHdaRegMap[idxReg].offset - offReg) % sizeof(uint32_t) * 8;
     2239        uint32_t shift = (g_aHdaRegMap[idxRegDsc].offset - offReg) % sizeof(uint32_t) * 8;
    21622240        uint32_t u32Value = 0;
    21632241        switch(cb)
     
    21752253        /* Cross-register access. Mac guest hits this assert doing assumption 4 byte access to 3 byte registers e.g. {I,O}SDnCTL
    21762254         */
    2177         //Assert((cb <= g_aHdaRegMap[idxReg].size - (offReg - g_aHdaRegMap[idxReg].offset)));
    2178         if (cb > g_aHdaRegMap[idxReg].size - (offReg - g_aHdaRegMap[idxReg].offset))
     2255        //Assert((cb <= g_aHdaRegMap[idxRegDsc].size - (offReg - g_aHdaRegMap[idxRegDsc].offset)));
     2256        if (cb > g_aHdaRegMap[idxRegDsc].size - (offReg - g_aHdaRegMap[idxRegDsc].offset))
    21792257        {
    2180             int off = cb - (g_aHdaRegMap[idxReg].size - (offReg - g_aHdaRegMap[idxReg].offset));
     2258            int off = cb - (g_aHdaRegMap[idxRegDsc].size - (offReg - g_aHdaRegMap[idxRegDsc].offset));
    21812259            rc = hdaMMIORead(pDevIns, pvUser, GCPhysAddr + cb - off, (char *)pv + cb - off, off);
    21822260            if (RT_FAILURE(rc))
    21832261                AssertRCReturn (rc, rc);
    21842262        }
    2185         //Assert(((offReg - g_aHdaRegMap[idxReg].offset) == 0));
     2263        //Assert(((offReg - g_aHdaRegMap[idxRegDsc].offset) == 0));
    21862264#endif
    21872265        mask <<= shift;
    2188         rc = g_aHdaRegMap[idxReg].pfnRead(pThis, idxReg, &u32Value);
     2266        rc = g_aHdaRegMap[idxRegDsc].pfnRead(pThis, idxRegDsc, &u32Value);
    21892267        *(uint32_t *)pv |= (u32Value & mask);
    2190         Log(("hda: read %s[%x/%x]\n", g_aHdaRegMap[idxReg].abbrev, u32Value, *(uint32_t *)pv));
     2268        Log(("hda: read %s[%x/%x]\n", g_aHdaRegMap[idxRegDsc].abbrev, u32Value, *(uint32_t *)pv));
    21912269    }
    21922270    else
     
    22132291
    22142292
    2215 DECLINLINE(int) hdaWriteReg(PHDASTATE pThis, int idxReg, uint32_t u32Value, char const *pszLog)
    2216 {
    2217     if (pThis->fInReset && idxReg != HDA_REG_GCTL)
     2293DECLINLINE(int) hdaWriteReg(PHDASTATE pThis, int idxRegDsc, uint32_t u32Value, char const *pszLog)
     2294{
     2295    if (pThis->fInReset && idxRegDsc != HDA_REG_GCTL)
    22182296        Log(("hda: access to registers except GCTL is blocked while reset\n"));  /** @todo where is this enforced? */
    22192297
     2298    uint32_t idxRegMem = g_aHdaRegMap[idxRegDsc].mem_idx;
    22202299#ifdef LOG_ENABLED
    2221     uint32_t const u32CurValue = pThis->au32Regs[idxReg];
    2222 #endif
    2223     int rc = g_aHdaRegMap[idxReg].pfnWrite(pThis, idxReg, u32Value);
    2224     Log(("hda: write %#x -> %s[%db]; %x => %x%s\n", u32Value, g_aHdaRegMap[idxReg].abbrev,
    2225          g_aHdaRegMap[idxReg].size, u32CurValue, pThis->au32Regs[idxReg], pszLog));
     2300    uint32_t const u32CurValue = pThis->au32Regs[idxRegMem];
     2301#endif
     2302    int rc = g_aHdaRegMap[idxRegDsc].pfnWrite(pThis, idxRegDsc, u32Value);
     2303    Log(("hda: write %#x -> %s[%db]; %x => %x%s\n", u32Value, g_aHdaRegMap[idxRegDsc].abbrev,
     2304         g_aHdaRegMap[idxRegDsc].size, u32CurValue, pThis->au32Regs[idxRegMem], pszLog));
    22262305    return rc;
    22272306}
     
    22382317    /*
    22392318     * The behavior of accesses that aren't aligned on natural boundraries is
    2240      * undefined. Just reject them out right.
     2319     * undefined. Just reject them outright.
    22412320     */
    22422321    /** @todo IOM could check this, it could also split the 8 byte accesses for us. */
     
    22462325
    22472326    /*
    2248      * Lookup and log the access.
     2327     * Look up and log the access.
    22492328     */
    22502329    uint32_t    offReg = GCPhysAddr - pThis->MMIOBaseAddr;
    2251     int         idxReg = hdaRegLookup(pThis, offReg);
     2330    int         idxRegDsc = hdaRegLookup(pThis, offReg);
     2331    uint32_t    idxRegMem = g_aHdaRegMap[idxRegDsc].mem_idx;
    22522332    uint64_t    u64Value;
    22532333    if (cb == 4)        u64Value = *(uint32_t const *)pv;
     
    22622342
    22632343#ifdef LOG_ENABLED
    2264     uint32_t const u32LogOldValue = idxReg != -1 ? pThis->au32Regs[idxReg] : UINT32_MAX;
     2344    uint32_t const u32LogOldValue = idxRegDsc != -1 ? pThis->au32Regs[idxRegMem] : UINT32_MAX;
    22652345    uint32_t const offRegLog = offReg;
    2266     int      const idxRegLog = idxReg;
    2267     if (idxReg == -1)
     2346    int      const idxRegLog = idxRegMem;
     2347    if (idxRegDsc == -1)
    22682348        Log(("hdaMMIOWrite: @%#05x u32=%#010x cb=%d\n", offReg, *(uint32_t const *)pv, cb));
    22692349    else if (cb == 4)
    2270         Log(("hdaMMIOWrite: @%#05x u32=%#010x %s\n", offReg, *(uint32_t *)pv, g_aHdaRegMap[idxReg].abbrev));
     2350        Log(("hdaMMIOWrite: @%#05x u32=%#010x %s\n", offReg, *(uint32_t *)pv, g_aHdaRegMap[idxRegDsc].abbrev));
    22712351    else if (cb == 2)
    2272         Log(("hdaMMIOWrite: @%#05x u16=%#06x (%#010x) %s\n", offReg, *(uint16_t *)pv, *(uint32_t *)pv, g_aHdaRegMap[idxReg].abbrev));
     2352        Log(("hdaMMIOWrite: @%#05x u16=%#06x (%#010x) %s\n", offReg, *(uint16_t *)pv, *(uint32_t *)pv, g_aHdaRegMap[idxRegDsc].abbrev));
    22732353    else if (cb == 1)
    2274         Log(("hdaMMIOWrite: @%#05x u8=%#04x (%#010x) %s\n", offReg, *(uint8_t *)pv, *(uint32_t *)pv, g_aHdaRegMap[idxReg].abbrev));
    2275     if (idxReg != -1 && g_aHdaRegMap[idxReg].size != cb)
    2276         Log(("hdaMMIOWrite: size=%d != cb=%d!!\n", g_aHdaRegMap[idxReg].size, cb));
     2354        Log(("hdaMMIOWrite: @%#05x u8=%#04x (%#010x) %s\n", offReg, *(uint8_t *)pv, *(uint32_t *)pv, g_aHdaRegMap[idxRegDsc].abbrev));
     2355    if (idxRegDsc != -1 && g_aHdaRegMap[idxRegDsc].size != cb)
     2356        Log(("hdaMMIOWrite: size=%d != cb=%d!!\n", g_aHdaRegMap[idxRegDsc].size, cb));
    22772357#endif
    22782358
     
    22822362     * Try for a direct hit first.
    22832363     */
    2284     if (idxReg != -1 && g_aHdaRegMap[idxReg].size == cb)
    2285         rc = hdaWriteReg(pThis, idxReg, u64Value, "");
     2364    if (idxRegDsc != -1 && g_aHdaRegMap[idxRegDsc].size == cb)
     2365        rc = hdaWriteReg(pThis, idxRegDsc, u64Value, "");
    22862366    /*
    22872367     * Partial or multiple register access, loop thru the requested memory.
     
    22932373           will only see 1 or 2 byte accesses of this kind, so no risk of
    22942374           shifting out input values. */
    2295         if (idxReg == -1 && (idxReg = hdaRegLookupWithin(pThis, offReg)) != -1)
     2375        if (idxRegDsc == -1 && (idxRegDsc = hdaRegLookupWithin(pThis, offReg)) != -1)
    22962376        {
    2297             uint32_t const cbBefore = offReg - g_aHdaRegMap[idxReg].offset; Assert(cbBefore > 0 && cbBefore < 4);
     2377            uint32_t const cbBefore = offReg - g_aHdaRegMap[idxRegDsc].offset; Assert(cbBefore > 0 && cbBefore < 4);
    22982378            offReg    -= cbBefore;
     2379            idxRegMem = g_aHdaRegMap[idxRegDsc].mem_idx;
    22992380            u64Value <<= cbBefore * 8;
    2300             u64Value  |= pThis->au32Regs[idxReg] & g_afMasks[cbBefore];
     2381            u64Value  |= pThis->au32Regs[idxRegMem] & g_afMasks[cbBefore];
    23012382            Log(("hdaMMIOWrite: Within register, supplied %u leading bits: %#llx -> %#llx ...\n",
    23022383                 cbBefore * 8, ~g_afMasks[cbBefore] & u64Value, u64Value));
    23032384        }
    23042385
    2305         /* Loop thru the write area, it may covert multiple registers. */
     2386        /* Loop thru the write area, it may cover multiple registers. */
    23062387        rc = VINF_SUCCESS;
    23072388        for (;;)
    23082389        {
    23092390            uint32_t cbReg;
    2310             if (idxReg != -1)
     2391            if (idxRegDsc != -1)
    23112392            {
    2312                 cbReg = g_aHdaRegMap[idxReg].size;
     2393                idxRegMem = g_aHdaRegMap[idxRegDsc].mem_idx;
     2394                cbReg = g_aHdaRegMap[idxRegDsc].size;
    23132395                if (cb < cbReg)
    23142396                {
    2315                     u64Value |= pThis->au32Regs[idxReg] & g_afMasks[cbReg] & ~g_afMasks[cb];
     2397                    u64Value |= pThis->au32Regs[idxRegMem] & g_afMasks[cbReg] & ~g_afMasks[cb];
    23162398                    Log(("hdaMMIOWrite: Supplying missing bits (%#x): %#llx -> %#llx ...\n",
    23172399                         g_afMasks[cbReg] & ~g_afMasks[cb], u64Value & g_afMasks[cb], u64Value));
    23182400                }
    2319                 rc = hdaWriteReg(pThis, idxReg, u64Value, "*");
     2401                rc = hdaWriteReg(pThis, idxRegDsc, u64Value, "*");
    23202402            }
    23212403            else
     
    23332415            cb     -= cbReg;
    23342416            u64Value >>= cbReg * 8;
    2335             if (idxReg == -1)
    2336                 idxReg = hdaRegLookup(pThis, offReg);
     2417            if (idxRegDsc == -1)
     2418                idxRegDsc = hdaRegLookup(pThis, offReg);
    23372419            else
    23382420            {
    2339                 idxReg++;
    2340                 if (   (unsigned)idxReg >= RT_ELEMENTS(g_aHdaRegMap)
    2341                     || g_aHdaRegMap[idxReg].offset != offReg)
    2342                     idxReg = -1;
     2421                idxRegDsc++;
     2422                if (   (unsigned)idxRegDsc >= RT_ELEMENTS(g_aHdaRegMap)
     2423                    || g_aHdaRegMap[idxRegDsc].offset != offReg)
     2424                    idxRegDsc = -1;
    23432425            }
    23442426        }
    23452427    }
    23462428#else
    2347     if (idxReg != -1)
     2429    if (idxRegDsc != -1)
    23482430    {
    23492431        /** @todo r=bird: This looks like code for handling unaligned register
     
    23602442         *
    23612443         */
    2362         uint32_t u32CurValue = pThis->au32Regs[idxReg];
     2444        uint32_t u32CurValue = pThis->au32Regs[idxRegMem];
    23632445        uint32_t u32NewValue;
    23642446        uint32_t mask;
     
    23842466        }
    23852467        /* cross-register access, see corresponding comment in hdaMMIORead */
    2386         uint32_t shift = (g_aHdaRegMap[idxReg].offset - offReg) % sizeof(uint32_t) * 8;
     2468        uint32_t shift = (g_aHdaRegMap[idxRegDsc].offset - offReg) % sizeof(uint32_t) * 8;
    23872469        mask <<= shift;
    23882470        u32NewValue <<= shift;
     
    23902472        u32NewValue |= (u32CurValue & ~mask);
    23912473
    2392         rc = g_aHdaRegMap[idxReg].pfnWrite(pThis, idxReg, u32NewValue);
    2393         Log(("hda: write %s:(%x) %x => %x\n", g_aHdaRegMap[idxReg].abbrev, u32NewValue,
    2394              u32CurValue, pThis->au32Regs[idxReg]));
     2474        rc = g_aHdaRegMap[idxRegDsc].pfnWrite(pThis, idxRegDsc, u32NewValue);
     2475        Log(("hda: write %s:(%x) %x => %x\n", g_aHdaRegMap[idxRegDsc].abbrev, u32NewValue,
     2476             u32CurValue, pThis->au32Regs[idxRegMem]));
    23952477    }
    23962478    else
     
    24692551
    24702552    /* Save MMIO registers */
    2471     AssertCompile(RT_ELEMENTS(pThis->au32Regs) == 112);
     2553    AssertCompile(RT_ELEMENTS(pThis->au32Regs) >= HDA_NREGS_SAVED);
    24722554    SSMR3PutU32(pSSM, RT_ELEMENTS(pThis->au32Regs));
    24732555    SSMR3PutMem(pSSM, pThis->au32Regs, sizeof(pThis->au32Regs));
     
    25212603        case HDA_SSM_VERSION_3:
    25222604            cRegs = 112;
    2523             AssertCompile(RT_ELEMENTS(pThis->au32Regs) == 112);
     2605            AssertCompile(RT_ELEMENTS(pThis->au32Regs) >= HDA_NREGS_SAVED);
    25242606            break;
    25252607
     
    25622644    AUD_set_active_out(pThis->pCodec->SwVoiceOut, SDCTL(pThis, 4) & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN));
    25632645
    2564     pThis->u64CORBBase = RT_MAKE_U64(CORBLBASE(pThis), CORBUBASE(pThis));
    2565     pThis->u64RIRBBase = RT_MAKE_U64(RIRLBASE(pThis), RIRUBASE(pThis));
    2566     pThis->u64DPBase   = RT_MAKE_U64(DPLBASE(pThis), DPUBASE(pThis));
     2646    pThis->u64CORBBase = RT_MAKE_U64(HDA_REG(pThis, CORBLBASE), HDA_REG(pThis, CORBUBASE));
     2647    pThis->u64RIRBBase = RT_MAKE_U64(HDA_REG(pThis, RIRBLBASE), HDA_REG(pThis, RIRBUBASE));
     2648    pThis->u64DPBase   = RT_MAKE_U64(HDA_REG(pThis, DPLBASE), HDA_REG(pThis, DPUBASE));
    25672649    return VINF_SUCCESS;
    25682650}
     
    26762758           && iHdaIndex >= 0
    26772759           && iHdaIndex < HDA_NREGS);
    2678     pHlp->pfnPrintf(pHlp, "hda: %s: 0x%x\n", g_aHdaRegMap[iHdaIndex].abbrev, pThis->au32Regs[iHdaIndex]);
     2760    pHlp->pfnPrintf(pHlp, "hda: %s: 0x%x\n", g_aHdaRegMap[iHdaIndex].abbrev, pThis->au32Regs[g_aHdaRegMap[iHdaIndex].mem_idx]);
    26792761}
    26802762
     
    27012783           && iHdaStrmIndex < 7);
    27022784    pHlp->pfnPrintf(pHlp, "Dump of %d HDA Stream:\n", iHdaStrmIndex);
    2703     pHlp->pfnPrintf(pHlp, "SD%dCTL: %R[sdctl]\n", iHdaStrmIndex, HDA_STREAM_REG2(pThis, CTL, iHdaStrmIndex));
    2704     pHlp->pfnPrintf(pHlp, "SD%dCTS: %R[sdsts]\n", iHdaStrmIndex, HDA_STREAM_REG2(pThis, STS, iHdaStrmIndex));
    2705     pHlp->pfnPrintf(pHlp, "SD%dFIFOS: %R[sdfifos]\n", iHdaStrmIndex, HDA_STREAM_REG2(pThis, FIFOS, iHdaStrmIndex));
    2706     pHlp->pfnPrintf(pHlp, "SD%dFIFOW: %R[sdfifow]\n", iHdaStrmIndex, HDA_STREAM_REG2(pThis, FIFOW, iHdaStrmIndex));
     2785    pHlp->pfnPrintf(pHlp, "SD%dCTL: %R[sdctl]\n", iHdaStrmIndex, HDA_STREAM_REG(pThis, CTL, iHdaStrmIndex));
     2786    pHlp->pfnPrintf(pHlp, "SD%dCTS: %R[sdsts]\n", iHdaStrmIndex, HDA_STREAM_REG(pThis, STS, iHdaStrmIndex));
     2787    pHlp->pfnPrintf(pHlp, "SD%dFIFOS: %R[sdfifos]\n", iHdaStrmIndex, HDA_STREAM_REG(pThis, FIFOS, iHdaStrmIndex));
     2788    pHlp->pfnPrintf(pHlp, "SD%dFIFOW: %R[sdfifow]\n", iHdaStrmIndex, HDA_STREAM_REG(pThis, FIFOW, iHdaStrmIndex));
    27072789}
    27082790
     
    27842866{
    27852867    PHDASTATE pThis = PDMINS_2_DATA(pDevIns, PHDASTATE);
    2786     GCAP(pThis) = HDA_MAKE_GCAP(4,4,0,0,1); /* see 6.2.1 */
    2787     VMIN(pThis) = 0x00;       /* see 6.2.2 */
    2788     VMAJ(pThis) = 0x01;       /* see 6.2.3 */
    2789     VMAJ(pThis) = 0x01;       /* see 6.2.3 */
    2790     OUTPAY(pThis) = 0x003C;   /* see 6.2.4 */
    2791     INPAY(pThis)  = 0x001D;   /* see 6.2.5 */
    2792     pThis->au32Regs[HDA_REG_CORBSIZE] = 0x42; /* see 6.2.1 */
    2793     pThis->au32Regs[HDA_REG_RIRBSIZE] = 0x42; /* see 6.2.1 */
    2794     CORBRP(pThis) = 0x0;
    2795     RIRBWP(pThis) = 0x0;
     2868    HDA_REG(pThis, GCAP)     = HDA_MAKE_GCAP(4,4,0,0,1); /* see 6.2.1 */
     2869    HDA_REG(pThis, VMIN)     = 0x00;    /* see 6.2.2 */
     2870    HDA_REG(pThis, VMAJ)     = 0x01;    /* see 6.2.3 */
     2871    HDA_REG(pThis, OUTPAY)   = 0x003C;  /* see 6.2.4 */
     2872    HDA_REG(pThis, INPAY)    = 0x001D;  /* see 6.2.5 */
     2873    HDA_REG(pThis, CORBSIZE) = 0x42;    /* see 6.2.1 */
     2874    HDA_REG(pThis, RIRBSIZE) = 0x42;    /* see 6.2.1 */
     2875    HDA_REG(pThis, CORBRP)   = 0x0;
     2876    HDA_REG(pThis, RIRBWP)   = 0x0;
    27962877
    27972878    Log(("hda: inter HDA reset.\n"));
     
    28272908        hdaInitTransferDescriptor(pThis, pBdle, u8Strm, &StreamDesc);
    28282909        /* hdaStreamReset prevents changing the SRST bit, so we force it to zero here. */
    2829         HDA_STREAM_REG2(pThis, CTL, u8Strm) = 0;
     2910        HDA_STREAM_REG(pThis, CTL, u8Strm) = 0;
    28302911        hdaStreamReset(pThis, pBdle, &StreamDesc, u8Strm);
    28312912    }
    28322913
    28332914    /* emulation of codec "wake up" (HDA spec 5.5.1 and 6.5)*/
    2834     STATESTS(pThis) = 0x1;
     2915    HDA_REG(pThis, STATESTS) = 0x1;
    28352916
    28362917    Log(("hda: reset finished\n"));
     
    30443125     * hdaReset shouldn't affects these registers.
    30453126     */
    3046     WAKEEN(pThis) = 0x0;
    3047     STATESTS(pThis) = 0x0;
     3127    HDA_REG(pThis, WAKEEN)  = 0x0;
     3128    HDA_REG(pThis, STATESTS) = 0x0;
    30483129
    30493130    /*
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