VirtualBox

Changeset 44633 in vbox for trunk/src/VBox/Devices/Audio


Ignore:
Timestamp:
Feb 11, 2013 3:09:46 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
83721
Message:

DevIchIntelHDA.cpp: Cleanups.

File:
1 edited

Legend:

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

    r44571 r44633  
    55
    66/*
    7  * Copyright (C) 2006-2012 Oracle Corporation
     7 * Copyright (C) 2006-2013 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    3737#include "DevCodec.h"
    3838
     39
     40/*******************************************************************************
     41*   Defined Constants And Macros                                               *
     42*******************************************************************************/
     43//#define HDA_AS_PCI_EXPRESS
    3944#define VBOX_WITH_INTEL_HDA
    4045
     
    5560#endif
    5661
    57 PDMBOTHCBDECL(int) hdaMMIORead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb);
    58 PDMBOTHCBDECL(int) hdaMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void const *pv, unsigned cb);
    59 static DECLCALLBACK(void)  hdaReset (PPDMDEVINS pDevIns);
    60 
    6162#define HDA_NREGS 112
    6263/* Registers */
     
    8283 */
    8384#define HDA_MAKE_GCAP(oss, iss, bss, bds, b64sup) \
    84     (  (((oss) & 0xF) << 12)    \
    85      | (((iss) & 0xF) << 8)     \
     85    (  (((oss) & 0xF)  << 12)   \
     86     | (((iss) & 0xF)  << 8)    \
    8687     | (((bss) & 0x1F) << 3)    \
    87      | (((bds) & 0x3) << 2)     \
     88     | (((bds) & 0x3)  << 2)    \
    8889     | ((b64sup) & 1))
    89 #define ICH6_HDA_REG_VMIN 1 /* range 0x02 */
    90 #define VMIN(pState) (HDA_REG((pState), VMIN))
    91 
    92 #define ICH6_HDA_REG_VMAJ 2 /* range 0x03 */
    93 #define VMAJ(pState) (HDA_REG((pState), VMAJ))
    94 
    95 #define ICH6_HDA_REG_OUTPAY 3 /* range 0x04-0x05 */
    96 #define OUTPAY(pState) (HDA_REG((pState), OUTPAY))
    97 
    98 #define ICH6_HDA_REG_INPAY 4 /* range 0x06-0x07 */
    99 #define INPAY(pState) (HDA_REG((pState), INPAY))
    100 
    101 #define ICH6_HDA_REG_GCTL (5)
    102 #define ICH6_HDA_GCTL_RST_SHIFT (0)
    103 #define ICH6_HDA_GCTL_FSH_SHIFT (1)
    104 #define ICH6_HDA_GCTL_UR_SHIFT (8)
    105 #define GCTL(pState) (HDA_REG((pState), GCTL))
    106 
    107 #define ICH6_HDA_REG_WAKEEN 6 /* 0x0C */
    108 #define WAKEEN(pState) (HDA_REG((pState), WAKEEN))
    109 
    110 #define ICH6_HDA_REG_STATESTS 7 /* range 0x0E */
    111 #define STATESTS(pState) (HDA_REG((pState), STATESTS))
    112 #define ICH6_HDA_STATES_SCSF 0x7
    113 
    114 #define ICH6_HDA_REG_GSTS 8 /* range 0x10-0x11*/
    115 #define ICH6_HDA_GSTS_FSH_SHIFT (1)
    116 #define GSTS(pState) (HDA_REG(pState, GSTS))
    117 
    118 #define ICH6_HDA_REG_INTCTL 9 /* 0x20 */
    119 #define ICH6_HDA_INTCTL_GIE_SHIFT 31
    120 #define ICH6_HDA_INTCTL_CIE_SHIFT 30
    121 #define ICH6_HDA_INTCTL_S0_SHIFT (0)
    122 #define ICH6_HDA_INTCTL_S1_SHIFT (1)
    123 #define ICH6_HDA_INTCTL_S2_SHIFT (2)
    124 #define ICH6_HDA_INTCTL_S3_SHIFT (3)
    125 #define ICH6_HDA_INTCTL_S4_SHIFT (4)
    126 #define ICH6_HDA_INTCTL_S5_SHIFT (5)
    127 #define ICH6_HDA_INTCTL_S6_SHIFT (6)
    128 #define ICH6_HDA_INTCTL_S7_SHIFT (7)
    129 #define INTCTL(pState) (HDA_REG((pState), INTCTL))
    130 #define INTCTL_GIE(pState) (HDA_REG_FLAG_VALUE(pState, INTCTL, GIE))
    131 #define INTCTL_CIE(pState) (HDA_REG_FLAG_VALUE(pState, INTCTL, CIE))
    132 #define INTCTL_SX(pState, X) (HDA_REG_FLAG_VALUE((pState), INTCTL, S##X))
    133 #define INTCTL_SALL(pState) (INTCTL((pState)) & 0xFF)
     90#define ICH6_HDA_REG_VMIN           1 /* range 0x02 */
     91#define VMIN(pState)                (HDA_REG((pState), VMIN))
     92
     93#define ICH6_HDA_REG_VMAJ           2 /* range 0x03 */
     94#define VMAJ(pState)                (HDA_REG((pState), VMAJ))
     95
     96#define ICH6_HDA_REG_OUTPAY         3 /* range 0x04-0x05 */
     97#define OUTPAY(pState)              (HDA_REG((pState), OUTPAY))
     98
     99#define ICH6_HDA_REG_INPAY          4 /* range 0x06-0x07 */
     100#define INPAY(pState)               (HDA_REG((pState), INPAY))
     101
     102#define ICH6_HDA_REG_GCTL           (5)
     103#define ICH6_HDA_GCTL_RST_SHIFT     (0)
     104#define ICH6_HDA_GCTL_FSH_SHIFT     (1)
     105#define ICH6_HDA_GCTL_UR_SHIFT      (8)
     106#define GCTL(pState)                (HDA_REG((pState), GCTL))
     107
     108#define ICH6_HDA_REG_WAKEEN         6 /* 0x0C */
     109#define WAKEEN(pState)              (HDA_REG((pState), WAKEEN))
     110
     111#define ICH6_HDA_REG_STATESTS       7 /* range 0x0E */
     112#define STATESTS(pState)            (HDA_REG((pState), STATESTS))
     113#define ICH6_HDA_STATES_SCSF        0x7
     114
     115#define ICH6_HDA_REG_GSTS           8 /* range 0x10-0x11*/
     116#define ICH6_HDA_GSTS_FSH_SHIFT     (1)
     117#define GSTS(pState)                (HDA_REG(pState, GSTS))
     118
     119#define ICH6_HDA_REG_INTCTL         9 /* 0x20 */
     120#define ICH6_HDA_INTCTL_GIE_SHIFT   31
     121#define ICH6_HDA_INTCTL_CIE_SHIFT   30
     122#define ICH6_HDA_INTCTL_S0_SHIFT    (0)
     123#define ICH6_HDA_INTCTL_S1_SHIFT    (1)
     124#define ICH6_HDA_INTCTL_S2_SHIFT    (2)
     125#define ICH6_HDA_INTCTL_S3_SHIFT    (3)
     126#define ICH6_HDA_INTCTL_S4_SHIFT    (4)
     127#define ICH6_HDA_INTCTL_S5_SHIFT    (5)
     128#define ICH6_HDA_INTCTL_S6_SHIFT    (6)
     129#define ICH6_HDA_INTCTL_S7_SHIFT    (7)
     130#define INTCTL(pState)              (HDA_REG((pState), INTCTL))
     131#define INTCTL_GIE(pState)          (HDA_REG_FLAG_VALUE(pState, INTCTL, GIE))
     132#define INTCTL_CIE(pState)          (HDA_REG_FLAG_VALUE(pState, INTCTL, CIE))
     133#define INTCTL_SX(pState, X)        (HDA_REG_FLAG_VALUE((pState), INTCTL, S##X))
     134#define INTCTL_SALL(pState)         (INTCTL((pState)) & 0xFF)
    134135
    135136/* Note: The HDA specification defines a SSYNC register at offset 0x38. The
     
    137138 * the datasheet.
    138139 */
    139 #define ICH6_HDA_REG_SSYNC  12 /* 0x34 */
    140 #define SSYNC(pState) (HDA_REG((pState), SSYNC))
    141 
    142 #define ICH6_HDA_REG_INTSTS 10 /* 0x24 */
    143 #define ICH6_HDA_INTSTS_GIS_SHIFT (31)
    144 #define ICH6_HDA_INTSTS_CIS_SHIFT (30)
    145 #define ICH6_HDA_INTSTS_S0_SHIFT (0)
    146 #define ICH6_HDA_INTSTS_S1_SHIFT (1)
    147 #define ICH6_HDA_INTSTS_S2_SHIFT (2)
    148 #define ICH6_HDA_INTSTS_S3_SHIFT (3)
    149 #define ICH6_HDA_INTSTS_S4_SHIFT (4)
    150 #define ICH6_HDA_INTSTS_S5_SHIFT (5)
    151 #define ICH6_HDA_INTSTS_S6_SHIFT (6)
    152 #define ICH6_HDA_INTSTS_S7_SHIFT (7)
     140#define ICH6_HDA_REG_SSYNC          12 /* 0x34 */
     141#define SSYNC(pState)               (HDA_REG((pState), SSYNC))
     142
     143#define ICH6_HDA_REG_INTSTS         10 /* 0x24 */
     144#define ICH6_HDA_INTSTS_GIS_SHIFT   (31)
     145#define ICH6_HDA_INTSTS_CIS_SHIFT   (30)
     146#define ICH6_HDA_INTSTS_S0_SHIFT    (0)
     147#define ICH6_HDA_INTSTS_S1_SHIFT    (1)
     148#define ICH6_HDA_INTSTS_S2_SHIFT    (2)
     149#define ICH6_HDA_INTSTS_S3_SHIFT    (3)
     150#define ICH6_HDA_INTSTS_S4_SHIFT    (4)
     151#define ICH6_HDA_INTSTS_S5_SHIFT    (5)
     152#define ICH6_HDA_INTSTS_S6_SHIFT    (6)
     153#define ICH6_HDA_INTSTS_S7_SHIFT    (7)
    153154#define ICH6_HDA_INTSTS_S_MASK(num) RT_BIT(HDA_REG_FIELD_SHIFT(S##num))
    154 #define INTSTS(pState) (HDA_REG((pState), INTSTS))
    155 #define INTSTS_GIS(pState) (HDA_REG_FLAG_VALUE((pState), INTSTS, GIS)
    156 #define INTSTS_CIS(pState) (HDA_REG_FLAG_VALUE((pState), INTSTS, CIS)
    157 #define INTSTS_SX(pState, X) (HDA_REG_FLAG_VALUE(pState), INTSTS, S##X)
    158 #define INTSTS_SANY(pState) (INTSTS((pState)) & 0xFF)
    159 
    160 #define ICH6_HDA_REG_CORBLBASE  13 /* 0x40 */
    161 #define CORBLBASE(pState) (HDA_REG((pState), CORBLBASE))
    162 #define ICH6_HDA_REG_CORBUBASE  14 /* 0x44 */
    163 #define CORBUBASE(pState) (HDA_REG((pState), CORBUBASE))
    164 #define ICH6_HDA_REG_CORBWP  15 /* 48 */
    165 #define ICH6_HDA_REG_CORBRP  16 /* 4A */
    166 #define ICH6_HDA_CORBRP_RST_SHIFT  15
    167 #define ICH6_HDA_CORBRP_WP_SHIFT  0
    168 #define ICH6_HDA_CORBRP_WP_MASK   0xFF
    169 
    170 #define CORBRP(pState) (HDA_REG(pState, CORBRP))
    171 #define CORBWP(pState) (HDA_REG(pState, CORBWP))
    172 
    173 #define ICH6_HDA_REG_CORBCTL  17 /* 0x4C */
    174 #define ICH6_HDA_CORBCTL_DMA_SHIFT (1)
     155#define INTSTS(pState)              (HDA_REG((pState), INTSTS))
     156#define INTSTS_GIS(pState)          (HDA_REG_FLAG_VALUE((pState), INTSTS, GIS)
     157#define INTSTS_CIS(pState)          (HDA_REG_FLAG_VALUE((pState), INTSTS, CIS)
     158#define INTSTS_SX(pState, X)        (HDA_REG_FLAG_VALUE(pState), INTSTS, S##X)
     159#define INTSTS_SANY(pState)         (INTSTS((pState)) & 0xFF)
     160
     161#define ICH6_HDA_REG_CORBLBASE      13 /* 0x40 */
     162#define CORBLBASE(pState)           (HDA_REG((pState), CORBLBASE))
     163#define ICH6_HDA_REG_CORBUBASE      14 /* 0x44 */
     164#define CORBUBASE(pState)           (HDA_REG((pState), CORBUBASE))
     165#define ICH6_HDA_REG_CORBWP         15 /* 48 */
     166#define ICH6_HDA_REG_CORBRP         16 /* 4A */
     167#define ICH6_HDA_CORBRP_RST_SHIFT   15
     168#define ICH6_HDA_CORBRP_WP_SHIFT    0
     169#define ICH6_HDA_CORBRP_WP_MASK     0xFF
     170
     171#define CORBRP(pState)              (HDA_REG(pState, CORBRP))
     172#define CORBWP(pState)              (HDA_REG(pState, CORBWP))
     173
     174#define ICH6_HDA_REG_CORBCTL        17 /* 0x4C */
     175#define ICH6_HDA_CORBCTL_DMA_SHIFT  (1)
    175176#define ICH6_HDA_CORBCTL_CMEIE_SHIFT (0)
    176177
    177 #define CORBCTL(pState) (HDA_REG(pState, CORBCTL))
    178 
    179 
    180 #define ICH6_HDA_REG_CORBSTS  18 /* 0x4D */
    181 #define CORBSTS(pState) (HDA_REG(pState, CORBSTS))
    182 #define ICH6_HDA_CORBSTS_CMEI_SHIFT  (0)
    183 
    184 #define ICH6_HDA_REG_CORBSIZE  19 /* 0x4E */
    185 #define ICH6_HDA_CORBSIZE_SZ_CAP 0xF0
    186 #define ICH6_HDA_CORBSIZE_SZ 0x3
    187 #define CORBSIZE_SZ(pState) (HDA_REG(pState, ICH6_HDA_REG_CORBSIZE) & ICH6_HDA_CORBSIZE_SZ)
    188 #define CORBSIZE_SZ_CAP(pState) (HDA_REG(pState, ICH6_HDA_REG_CORBSIZE) & ICH6_HDA_CORBSIZE_SZ_CAP)
     178#define CORBCTL(pState)             (HDA_REG(pState, CORBCTL))
     179
     180
     181#define ICH6_HDA_REG_CORBSTS        18 /* 0x4D */
     182#define CORBSTS(pState)             (HDA_REG(pState, CORBSTS))
     183#define ICH6_HDA_CORBSTS_CMEI_SHIFT (0)
     184
     185#define ICH6_HDA_REG_CORBSIZE       19 /* 0x4E */
     186#define ICH6_HDA_CORBSIZE_SZ_CAP    0xF0
     187#define ICH6_HDA_CORBSIZE_SZ        0x3
     188#define CORBSIZE_SZ(pState)         (HDA_REG(pState, ICH6_HDA_REG_CORBSIZE) & ICH6_HDA_CORBSIZE_SZ)
     189#define CORBSIZE_SZ_CAP(pState)     (HDA_REG(pState, ICH6_HDA_REG_CORBSIZE) & ICH6_HDA_CORBSIZE_SZ_CAP)
    189190/* till ich 10 sizes of CORB and RIRB are hardcoded to 256 in real hw */
    190191
    191 #define ICH6_HDA_REG_RIRLBASE  20 /* 0x50 */
    192 #define RIRLBASE(pState) (HDA_REG((pState), RIRLBASE))
    193 
    194 #define ICH6_HDA_REG_RIRUBASE  21 /* 0x54 */
    195 #define RIRUBASE(pState) (HDA_REG((pState), RIRUBASE))
    196 
    197 #define ICH6_HDA_REG_RIRBWP  22 /* 0x58 */
    198 #define ICH6_HDA_RIRBWP_RST_SHIFT  (15)
    199 #define ICH6_HDA_RIRBWP_WP_MASK   0xFF
    200 #define RIRBWP(pState) (HDA_REG(pState, RIRBWP))
    201 
    202 #define ICH6_HDA_REG_RINTCNT  23 /* 0x5A */
    203 #define RINTCNT(pState) (HDA_REG((pState), RINTCNT))
    204 #define RINTCNT_N(pState) (RINTCNT((pState)) & 0xff)
    205 
    206 #define ICH6_HDA_REG_RIRBCTL  24 /* 0x5C */
    207 #define ICH6_HDA_RIRBCTL_RIC_SHIFT    (0)
    208 #define ICH6_HDA_RIRBCTL_DMA_SHIFT    (1)
    209 #define ICH6_HDA_ROI_DMA_SHIFT        (2)
    210 #define RIRBCTL(pState)                 (HDA_REG((pState), RIRBCTL))
    211 #define RIRBCTL_RIRB_RIC(pState)        (HDA_REG_FLAG_VALUE(pState, RIRBCTL, RIC))
    212 #define RIRBCTL_RIRB_DMA(pState)        (HDA_REG_FLAG_VALUE((pState), RIRBCTL, DMA)
    213 #define RIRBCTL_ROI(pState)             (HDA_REG_FLAG_VALUE((pState), RIRBCTL, ROI))
    214 
    215 #define ICH6_HDA_REG_RIRBSTS  25 /* 0x5D */
     192#define ICH6_HDA_REG_RIRLBASE       20 /* 0x50 */
     193#define RIRLBASE(pState)            (HDA_REG((pState), RIRLBASE))
     194
     195#define ICH6_HDA_REG_RIRUBASE       21 /* 0x54 */
     196#define RIRUBASE(pState)            (HDA_REG((pState), RIRUBASE))
     197
     198#define ICH6_HDA_REG_RIRBWP         22 /* 0x58 */
     199#define ICH6_HDA_RIRBWP_RST_SHIFT   (15)
     200#define ICH6_HDA_RIRBWP_WP_MASK     0xFF
     201#define RIRBWP(pState)              (HDA_REG(pState, RIRBWP))
     202
     203#define ICH6_HDA_REG_RINTCNT        23 /* 0x5A */
     204#define RINTCNT(pState)             (HDA_REG((pState), RINTCNT))
     205#define RINTCNT_N(pState)           (RINTCNT((pState)) & 0xff)
     206
     207#define ICH6_HDA_REG_RIRBCTL        24 /* 0x5C */
     208#define ICH6_HDA_RIRBCTL_RIC_SHIFT  (0)
     209#define ICH6_HDA_RIRBCTL_DMA_SHIFT  (1)
     210#define ICH6_HDA_ROI_DMA_SHIFT      (2)
     211#define RIRBCTL(pState)             (HDA_REG((pState), RIRBCTL))
     212#define RIRBCTL_RIRB_RIC(pState)    (HDA_REG_FLAG_VALUE(pState, RIRBCTL, RIC))
     213#define RIRBCTL_RIRB_DMA(pState)    (HDA_REG_FLAG_VALUE((pState), RIRBCTL, DMA)
     214#define RIRBCTL_ROI(pState)         (HDA_REG_FLAG_VALUE((pState), RIRBCTL, ROI))
     215
     216#define ICH6_HDA_REG_RIRBSTS        25 /* 0x5D */
    216217#define ICH6_HDA_RIRBSTS_RINTFL_SHIFT (0)
    217218#define ICH6_HDA_RIRBSTS_RIRBOIS_SHIFT (2)
    218 #define RIRBSTS(pState)         (HDA_REG(pState, RIRBSTS))
    219 #define RIRBSTS_RINTFL(pState)  (HDA_REG_FLAG_VALUE(pState, RIRBSTS, RINTFL))
    220 #define RIRBSTS_RIRBOIS(pState) (HDA_REG_FLAG_VALUE(pState, RIRBSTS, RIRBOIS))
    221 
    222 #define ICH6_HDA_REG_RIRBSIZE  26 /* 0x5E */
    223 #define ICH6_HDA_RIRBSIZE_SZ_CAP 0xF0
    224 #define ICH6_HDA_RIRBSIZE_SZ 0x3
    225 
    226 #define RIRBSIZE_SZ(pState)     (HDA_REG(pState, ICH6_HDA_REG_RIRBSIZE) & ICH6_HDA_RIRBSIZE_SZ)
    227 #define RIRBSIZE_SZ_CAP(pState) (HDA_REG(pState, ICH6_HDA_REG_RIRBSIZE) & ICH6_HDA_RIRBSIZE_SZ_CAP)
    228 
    229 
    230 #define ICH6_HDA_REG_IC   27 /* 0x60 */
    231 #define IC(pState) (HDA_REG(pState, IC))
    232 #define ICH6_HDA_REG_IR   28 /* 0x64 */
    233 #define IR(pState) (HDA_REG(pState, IR))
    234 #define ICH6_HDA_REG_IRS  29 /* 0x68 */
    235 #define ICH6_HDA_IRS_ICB_SHIFT   (0)
    236 #define ICH6_HDA_IRS_IRV_SHIFT   (1)
    237 #define IRS(pState)     (HDA_REG(pState, IRS))
    238 #define IRS_ICB(pState) (HDA_REG_FLAG_VALUE(pState, IRS, ICB))
    239 #define IRS_IRV(pState) (HDA_REG_FLAG_VALUE(pState, IRS, IRV))
    240 
    241 #define ICH6_HDA_REG_DPLBASE  30 /* 0x70 */
    242 #define DPLBASE(pState) (HDA_REG((pState), DPLBASE))
    243 #define ICH6_HDA_REG_DPUBASE  31 /* 0x74 */
    244 #define DPUBASE(pState) (HDA_REG((pState), DPUBASE))
    245 #define DPBASE_ENABLED          1
    246 #define DPBASE_ADDR_MASK        (~0x7f)
    247 
    248 #define HDA_STREAM_REG_DEF(name, num) (ICH6_HDA_REG_SD##num##name)
    249 #define HDA_STREAM_REG(pState, name, num) (HDA_REG((pState), N_(HDA_STREAM_REG_DEF(name, num))))
     219#define RIRBSTS(pState)             (HDA_REG(pState, RIRBSTS))
     220#define RIRBSTS_RINTFL(pState)      (HDA_REG_FLAG_VALUE(pState, RIRBSTS, RINTFL))
     221#define RIRBSTS_RIRBOIS(pState)     (HDA_REG_FLAG_VALUE(pState, RIRBSTS, RIRBOIS))
     222
     223#define ICH6_HDA_REG_RIRBSIZE       26 /* 0x5E */
     224#define ICH6_HDA_RIRBSIZE_SZ_CAP    0xF0
     225#define ICH6_HDA_RIRBSIZE_SZ        0x3
     226
     227#define RIRBSIZE_SZ(pState)         (HDA_REG(pState, ICH6_HDA_REG_RIRBSIZE) & ICH6_HDA_RIRBSIZE_SZ)
     228#define RIRBSIZE_SZ_CAP(pState)     (HDA_REG(pState, ICH6_HDA_REG_RIRBSIZE) & ICH6_HDA_RIRBSIZE_SZ_CAP)
     229
     230
     231#define ICH6_HDA_REG_IC             27 /* 0x60 */
     232#define IC(pState)                  (HDA_REG(pState, IC))
     233#define ICH6_HDA_REG_IR             28 /* 0x64 */
     234#define IR(pState)                  (HDA_REG(pState, IR))
     235#define ICH6_HDA_REG_IRS            29 /* 0x68 */
     236#define ICH6_HDA_IRS_ICB_SHIFT      (0)
     237#define ICH6_HDA_IRS_IRV_SHIFT      (1)
     238#define IRS(pState)                 (HDA_REG(pState, IRS))
     239#define IRS_ICB(pState)             (HDA_REG_FLAG_VALUE(pState, IRS, ICB))
     240#define IRS_IRV(pState)             (HDA_REG_FLAG_VALUE(pState, IRS, IRV))
     241
     242#define ICH6_HDA_REG_DPLBASE        30 /* 0x70 */
     243#define DPLBASE(pState)             (HDA_REG((pState), DPLBASE))
     244#define ICH6_HDA_REG_DPUBASE        31 /* 0x74 */
     245#define DPUBASE(pState)             (HDA_REG((pState), DPUBASE))
     246#define DPBASE_ENABLED              1
     247#define DPBASE_ADDR_MASK            (~(uint64_t)0x7f)
     248
     249#define HDA_STREAM_REG_DEF(name, num)           (ICH6_HDA_REG_SD##num##name)
     250#define HDA_STREAM_REG(pState, name, num)       (HDA_REG((pState), N_(HDA_STREAM_REG_DEF(name, num))))
    250251/* Note: sdnum here _MUST_ be stream reg number [0,7] */
    251 #define HDA_STREAM_REG2(pState, name, sdnum) (HDA_REG_IND((pState), ICH6_HDA_REG_SD0##name + (sdnum) * 10))
    252 
    253 #define ICH6_HDA_REG_SD0CTL   32 /* 0x80 */
    254 #define ICH6_HDA_REG_SD1CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 10) /* 0xA0 */
    255 #define ICH6_HDA_REG_SD2CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 20) /* 0xC0 */
    256 #define ICH6_HDA_REG_SD3CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 30) /* 0xE0 */
    257 #define ICH6_HDA_REG_SD4CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 40) /* 0x100 */
    258 #define ICH6_HDA_REG_SD5CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 50) /* 0x120 */
    259 #define ICH6_HDA_REG_SD6CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 60) /* 0x140 */
    260 #define ICH6_HDA_REG_SD7CTL   (HDA_STREAM_REG_DEF(CTL, 0) + 70) /* 0x160 */
    261 
    262 #define SD(func, num) SD##num##func
    263 #define SDCTL(pState, num) HDA_REG((pState), SD(CTL, num))
    264 #define SDCTL_NUM(pState, num) ((SDCTL((pState), num) & HDA_REG_FIELD_MASK(SDCTL,NUM)) >> HDA_REG_FIELD_SHIFT(SDCTL, NUM))
    265 #define ICH6_HDA_SDCTL_NUM_MASK   (0xF)
    266 #define ICH6_HDA_SDCTL_NUM_SHIFT  (20)
    267 #define ICH6_HDA_SDCTL_DIR_SHIFT  (19)
    268 #define ICH6_HDA_SDCTL_TP_SHIFT   (18)
     252#define HDA_STREAM_REG2(pState, name, sdnum)    (HDA_REG_IND((pState), ICH6_HDA_REG_SD0##name + (sdnum) * 10))
     253
     254#define ICH6_HDA_REG_SD0CTL         32 /* 0x80 */
     255#define ICH6_HDA_REG_SD1CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 10) /* 0xA0 */
     256#define ICH6_HDA_REG_SD2CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 20) /* 0xC0 */
     257#define ICH6_HDA_REG_SD3CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 30) /* 0xE0 */
     258#define ICH6_HDA_REG_SD4CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 40) /* 0x100 */
     259#define ICH6_HDA_REG_SD5CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 50) /* 0x120 */
     260#define ICH6_HDA_REG_SD6CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 60) /* 0x140 */
     261#define ICH6_HDA_REG_SD7CTL         (HDA_STREAM_REG_DEF(CTL, 0) + 70) /* 0x160 */
     262
     263#define SD(func, num)               SD##num##func
     264#define SDCTL(pState, num)          HDA_REG((pState), SD(CTL, num))
     265#define SDCTL_NUM(pState, num)      ((SDCTL((pState), num) & HDA_REG_FIELD_MASK(SDCTL,NUM)) >> HDA_REG_FIELD_SHIFT(SDCTL, NUM))
     266#define ICH6_HDA_SDCTL_NUM_MASK     (0xF)
     267#define ICH6_HDA_SDCTL_NUM_SHIFT    (20)
     268#define ICH6_HDA_SDCTL_DIR_SHIFT    (19)
     269#define ICH6_HDA_SDCTL_TP_SHIFT     (18)
    269270#define ICH6_HDA_SDCTL_STRIPE_MASK  (0x3)
    270271#define ICH6_HDA_SDCTL_STRIPE_SHIFT (16)
    271 #define ICH6_HDA_SDCTL_DEIE_SHIFT (4)
    272 #define ICH6_HDA_SDCTL_FEIE_SHIFT (3)
    273 #define ICH6_HDA_SDCTL_ICE_SHIFT  (2)
    274 #define ICH6_HDA_SDCTL_RUN_SHIFT  (1)
    275 #define ICH6_HDA_SDCTL_SRST_SHIFT (0)
    276 
    277 #define ICH6_HDA_REG_SD0STS   33 /* 0x83 */
    278 #define ICH6_HDA_REG_SD1STS   (HDA_STREAM_REG_DEF(STS, 0) + 10) /* 0xA3 */
    279 #define ICH6_HDA_REG_SD2STS   (HDA_STREAM_REG_DEF(STS, 0) + 20) /* 0xC3 */
    280 #define ICH6_HDA_REG_SD3STS   (HDA_STREAM_REG_DEF(STS, 0) + 30) /* 0xE3 */
    281 #define ICH6_HDA_REG_SD4STS   (HDA_STREAM_REG_DEF(STS, 0) + 40) /* 0x103 */
    282 #define ICH6_HDA_REG_SD5STS   (HDA_STREAM_REG_DEF(STS, 0) + 50) /* 0x123 */
    283 #define ICH6_HDA_REG_SD6STS   (HDA_STREAM_REG_DEF(STS, 0) + 60) /* 0x143 */
    284 #define ICH6_HDA_REG_SD7STS   (HDA_STREAM_REG_DEF(STS, 0) + 70) /* 0x163 */
    285 
    286 #define SDSTS(pState, num) HDA_REG((pState), SD(STS, num))
     272#define ICH6_HDA_SDCTL_DEIE_SHIFT   (4)
     273#define ICH6_HDA_SDCTL_FEIE_SHIFT   (3)
     274#define ICH6_HDA_SDCTL_ICE_SHIFT    (2)
     275#define ICH6_HDA_SDCTL_RUN_SHIFT    (1)
     276#define ICH6_HDA_SDCTL_SRST_SHIFT   (0)
     277
     278#define ICH6_HDA_REG_SD0STS         33 /* 0x83 */
     279#define ICH6_HDA_REG_SD1STS         (HDA_STREAM_REG_DEF(STS, 0) + 10) /* 0xA3 */
     280#define ICH6_HDA_REG_SD2STS         (HDA_STREAM_REG_DEF(STS, 0) + 20) /* 0xC3 */
     281#define ICH6_HDA_REG_SD3STS         (HDA_STREAM_REG_DEF(STS, 0) + 30) /* 0xE3 */
     282#define ICH6_HDA_REG_SD4STS         (HDA_STREAM_REG_DEF(STS, 0) + 40) /* 0x103 */
     283#define ICH6_HDA_REG_SD5STS         (HDA_STREAM_REG_DEF(STS, 0) + 50) /* 0x123 */
     284#define ICH6_HDA_REG_SD6STS         (HDA_STREAM_REG_DEF(STS, 0) + 60) /* 0x143 */
     285#define ICH6_HDA_REG_SD7STS         (HDA_STREAM_REG_DEF(STS, 0) + 70) /* 0x163 */
     286
     287#define SDSTS(pState, num)          HDA_REG((pState), SD(STS, num))
    287288#define ICH6_HDA_SDSTS_FIFORDY_SHIFT (5)
    288 #define ICH6_HDA_SDSTS_DE_SHIFT (4)
    289 #define ICH6_HDA_SDSTS_FE_SHIFT (3)
    290 #define ICH6_HDA_SDSTS_BCIS_SHIFT  (2)
    291 
    292 #define ICH6_HDA_REG_SD0LPIB   34 /* 0x84 */
    293 #define ICH6_HDA_REG_SD1LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 10) /* 0xA4 */
    294 #define ICH6_HDA_REG_SD2LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 20) /* 0xC4 */
    295 #define ICH6_HDA_REG_SD3LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 30) /* 0xE4 */
    296 #define ICH6_HDA_REG_SD4LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 40) /* 0x104 */
    297 #define ICH6_HDA_REG_SD5LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 50) /* 0x124 */
    298 #define ICH6_HDA_REG_SD6LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 60) /* 0x144 */
    299 #define ICH6_HDA_REG_SD7LPIB   (HDA_STREAM_REG_DEF(LPIB, 0) + 70) /* 0x164 */
    300 
    301 #define SDLPIB(pState, num) HDA_REG((pState), SD(LPIB, num))
    302 
    303 #define ICH6_HDA_REG_SD0CBL   35 /* 0x88 */
    304 #define ICH6_HDA_REG_SD1CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 10) /* 0xA8 */
    305 #define ICH6_HDA_REG_SD2CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 20) /* 0xC8 */
    306 #define ICH6_HDA_REG_SD3CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 30) /* 0xE8 */
    307 #define ICH6_HDA_REG_SD4CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 40) /* 0x108 */
    308 #define ICH6_HDA_REG_SD5CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 50) /* 0x128 */
    309 #define ICH6_HDA_REG_SD6CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 60) /* 0x148 */
    310 #define ICH6_HDA_REG_SD7CBL   (HDA_STREAM_REG_DEF(CBL, 0) + 70) /* 0x168 */
    311 
    312 #define SDLCBL(pState, num) HDA_REG((pState), SD(CBL, num))
    313 
    314 #define ICH6_HDA_REG_SD0LVI   36 /* 0x8C */
    315 #define ICH6_HDA_REG_SD1LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 10) /* 0xAC */
    316 #define ICH6_HDA_REG_SD2LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 20) /* 0xCC */
    317 #define ICH6_HDA_REG_SD3LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 30) /* 0xEC */
    318 #define ICH6_HDA_REG_SD4LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 40) /* 0x10C */
    319 #define ICH6_HDA_REG_SD5LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 50) /* 0x12C */
    320 #define ICH6_HDA_REG_SD6LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 60) /* 0x14C */
    321 #define ICH6_HDA_REG_SD7LVI   (HDA_STREAM_REG_DEF(LVI, 0) + 70) /* 0x16C */
    322 
    323 #define SDLVI(pState, num) HDA_REG((pState), SD(LVI, num))
    324 
    325 #define ICH6_HDA_REG_SD0FIFOW   37 /* 0x8E */
    326 #define ICH6_HDA_REG_SD1FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 10) /* 0xAE */
    327 #define ICH6_HDA_REG_SD2FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 20) /* 0xCE */
    328 #define ICH6_HDA_REG_SD3FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 30) /* 0xEE */
    329 #define ICH6_HDA_REG_SD4FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 40) /* 0x10E */
    330 #define ICH6_HDA_REG_SD5FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 50) /* 0x12E */
    331 #define ICH6_HDA_REG_SD6FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 60) /* 0x14E */
    332 #define ICH6_HDA_REG_SD7FIFOW   (HDA_STREAM_REG_DEF(FIFOW, 0) + 70) /* 0x16E */
     289#define ICH6_HDA_SDSTS_DE_SHIFT     (4)
     290#define ICH6_HDA_SDSTS_FE_SHIFT     (3)
     291#define ICH6_HDA_SDSTS_BCIS_SHIFT   (2)
     292
     293#define ICH6_HDA_REG_SD0LPIB        34 /* 0x84 */
     294#define ICH6_HDA_REG_SD1LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 10) /* 0xA4 */
     295#define ICH6_HDA_REG_SD2LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 20) /* 0xC4 */
     296#define ICH6_HDA_REG_SD3LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 30) /* 0xE4 */
     297#define ICH6_HDA_REG_SD4LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 40) /* 0x104 */
     298#define ICH6_HDA_REG_SD5LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 50) /* 0x124 */
     299#define ICH6_HDA_REG_SD6LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 60) /* 0x144 */
     300#define ICH6_HDA_REG_SD7LPIB        (HDA_STREAM_REG_DEF(LPIB, 0) + 70) /* 0x164 */
     301
     302#define SDLPIB(pState, num)         HDA_REG((pState), SD(LPIB, num))
     303
     304#define ICH6_HDA_REG_SD0CBL         35 /* 0x88 */
     305#define ICH6_HDA_REG_SD1CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 10) /* 0xA8 */
     306#define ICH6_HDA_REG_SD2CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 20) /* 0xC8 */
     307#define ICH6_HDA_REG_SD3CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 30) /* 0xE8 */
     308#define ICH6_HDA_REG_SD4CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 40) /* 0x108 */
     309#define ICH6_HDA_REG_SD5CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 50) /* 0x128 */
     310#define ICH6_HDA_REG_SD6CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 60) /* 0x148 */
     311#define ICH6_HDA_REG_SD7CBL         (HDA_STREAM_REG_DEF(CBL, 0) + 70) /* 0x168 */
     312
     313#define SDLCBL(pState, num)         HDA_REG((pState), SD(CBL, num))
     314
     315#define ICH6_HDA_REG_SD0LVI         36 /* 0x8C */
     316#define ICH6_HDA_REG_SD1LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 10) /* 0xAC */
     317#define ICH6_HDA_REG_SD2LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 20) /* 0xCC */
     318#define ICH6_HDA_REG_SD3LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 30) /* 0xEC */
     319#define ICH6_HDA_REG_SD4LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 40) /* 0x10C */
     320#define ICH6_HDA_REG_SD5LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 50) /* 0x12C */
     321#define ICH6_HDA_REG_SD6LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 60) /* 0x14C */
     322#define ICH6_HDA_REG_SD7LVI         (HDA_STREAM_REG_DEF(LVI, 0) + 70) /* 0x16C */
     323
     324#define SDLVI(pState, num)          HDA_REG((pState), SD(LVI, num))
     325
     326#define ICH6_HDA_REG_SD0FIFOW       37 /* 0x8E */
     327#define ICH6_HDA_REG_SD1FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 10) /* 0xAE */
     328#define ICH6_HDA_REG_SD2FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 20) /* 0xCE */
     329#define ICH6_HDA_REG_SD3FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 30) /* 0xEE */
     330#define ICH6_HDA_REG_SD4FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 40) /* 0x10E */
     331#define ICH6_HDA_REG_SD5FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 50) /* 0x12E */
     332#define ICH6_HDA_REG_SD6FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 60) /* 0x14E */
     333#define ICH6_HDA_REG_SD7FIFOW       (HDA_STREAM_REG_DEF(FIFOW, 0) + 70) /* 0x16E */
    333334
    334335/*
    335336 * ICH6 datasheet defined limits for FIFOW values (18.2.38)
    336337 */
    337 #define HDA_SDFIFOW_8B       (0x2)
    338 #define HDA_SDFIFOW_16B      (0x3)
    339 #define HDA_SDFIFOW_32B      (0x4)
    340 #define SDFIFOW(pState, num) HDA_REG((pState), SD(FIFOW, num))
    341 
    342 #define ICH6_HDA_REG_SD0FIFOS   38 /* 0x90 */
    343 #define ICH6_HDA_REG_SD1FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 10) /* 0xB0 */
    344 #define ICH6_HDA_REG_SD2FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 20) /* 0xD0 */
    345 #define ICH6_HDA_REG_SD3FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 30) /* 0xF0 */
    346 #define ICH6_HDA_REG_SD4FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 40) /* 0x110 */
    347 #define ICH6_HDA_REG_SD5FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 50) /* 0x130 */
    348 #define ICH6_HDA_REG_SD6FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 60) /* 0x150 */
    349 #define ICH6_HDA_REG_SD7FIFOS   (HDA_STREAM_REG_DEF(FIFOS, 0) + 70) /* 0x170 */
     338#define HDA_SDFIFOW_8B              (0x2)
     339#define HDA_SDFIFOW_16B             (0x3)
     340#define HDA_SDFIFOW_32B             (0x4)
     341#define SDFIFOW(pState, num)        HDA_REG((pState), SD(FIFOW, num))
     342
     343#define ICH6_HDA_REG_SD0FIFOS       38 /* 0x90 */
     344#define ICH6_HDA_REG_SD1FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 10) /* 0xB0 */
     345#define ICH6_HDA_REG_SD2FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 20) /* 0xD0 */
     346#define ICH6_HDA_REG_SD3FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 30) /* 0xF0 */
     347#define ICH6_HDA_REG_SD4FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 40) /* 0x110 */
     348#define ICH6_HDA_REG_SD5FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 50) /* 0x130 */
     349#define ICH6_HDA_REG_SD6FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 60) /* 0x150 */
     350#define ICH6_HDA_REG_SD7FIFOS       (HDA_STREAM_REG_DEF(FIFOS, 0) + 70) /* 0x170 */
    350351
    351352/*
     
    354355 * Other values not listed are not supported.
    355356 */
    356 #define HDA_SDONFIFO_16B  (0x0F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
    357 #define HDA_SDONFIFO_32B  (0x1F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
    358 #define HDA_SDONFIFO_64B  (0x3F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
    359 #define HDA_SDONFIFO_128B (0x7F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
    360 #define HDA_SDONFIFO_192B (0xBF) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
    361 #define HDA_SDONFIFO_256B (0xFF) /* 20-, 24-bit Output Streams */
    362 #define HDA_SDINFIFO_120B (0x77) /* 8-, 16-, 20-, 24-, 32-bit Input Streams */
    363 #define HDA_SDINFIFO_160B (0x9F) /* 20-, 24-bit Input Streams Streams */
    364 #define SDFIFOS(pState, num) HDA_REG((pState), SD(FIFOS, num))
    365 
    366 #define ICH6_HDA_REG_SD0FMT     39 /* 0x92 */
    367 #define ICH6_HDA_REG_SD1FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 10) /* 0xB2 */
    368 #define ICH6_HDA_REG_SD2FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 20) /* 0xD2 */
    369 #define ICH6_HDA_REG_SD3FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 30) /* 0xF2 */
    370 #define ICH6_HDA_REG_SD4FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 40) /* 0x112 */
    371 #define ICH6_HDA_REG_SD5FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 50) /* 0x132 */
    372 #define ICH6_HDA_REG_SD6FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 60) /* 0x152 */
    373 #define ICH6_HDA_REG_SD7FMT     (HDA_STREAM_REG_DEF(FMT, 0) + 70) /* 0x172 */
    374 
    375 #define SDFMT(pState, num)      (HDA_REG((pState), SD(FMT, num)))
     357#define HDA_SDONFIFO_16B            (0x0F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     358#define HDA_SDONFIFO_32B            (0x1F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     359#define HDA_SDONFIFO_64B            (0x3F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     360#define HDA_SDONFIFO_128B           (0x7F) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     361#define HDA_SDONFIFO_192B           (0xBF) /* 8-, 16-, 20-, 24-, 32-bit Output Streams */
     362#define HDA_SDONFIFO_256B           (0xFF) /* 20-, 24-bit Output Streams */
     363#define HDA_SDINFIFO_120B           (0x77) /* 8-, 16-, 20-, 24-, 32-bit Input Streams */
     364#define HDA_SDINFIFO_160B           (0x9F) /* 20-, 24-bit Input Streams Streams */
     365#define SDFIFOS(pState, num)        HDA_REG((pState), SD(FIFOS, num))
     366
     367#define ICH6_HDA_REG_SD0FMT         39 /* 0x92 */
     368#define ICH6_HDA_REG_SD1FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 10) /* 0xB2 */
     369#define ICH6_HDA_REG_SD2FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 20) /* 0xD2 */
     370#define ICH6_HDA_REG_SD3FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 30) /* 0xF2 */
     371#define ICH6_HDA_REG_SD4FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 40) /* 0x112 */
     372#define ICH6_HDA_REG_SD5FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 50) /* 0x132 */
     373#define ICH6_HDA_REG_SD6FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 60) /* 0x152 */
     374#define ICH6_HDA_REG_SD7FMT         (HDA_STREAM_REG_DEF(FMT, 0) + 70) /* 0x172 */
     375
     376#define SDFMT(pState, num)          (HDA_REG((pState), SD(FMT, num)))
    376377#define ICH6_HDA_SDFMT_BASE_RATE_SHIFT (14)
    377 #define ICH6_HDA_SDFMT_MULT_SHIFT (11)
    378 #define ICH6_HDA_SDFMT_MULT_MASK (0x7)
    379 #define ICH6_HDA_SDFMT_DIV_SHIFT (8)
    380 #define ICH6_HDA_SDFMT_DIV_MASK (0x7)
    381 #define ICH6_HDA_SDFMT_BITS_SHIFT (4)
    382 #define ICH6_HDA_SDFMT_BITS_MASK (0x7)
     378#define ICH6_HDA_SDFMT_MULT_SHIFT   (11)
     379#define ICH6_HDA_SDFMT_MULT_MASK    (0x7)
     380#define ICH6_HDA_SDFMT_DIV_SHIFT    (8)
     381#define ICH6_HDA_SDFMT_DIV_MASK     (0x7)
     382#define ICH6_HDA_SDFMT_BITS_SHIFT   (4)
     383#define ICH6_HDA_SDFMT_BITS_MASK    (0x7)
    383384#define SDFMT_BASE_RATE(pState, num) ((SDFMT(pState, num) & HDA_REG_FIELD_FLAG_MASK(SDFMT, BASE_RATE)) >> HDA_REG_FIELD_SHIFT(SDFMT, BASE_RATE))
    384 #define SDFMT_MULT(pState, num) ((SDFMT((pState), num) & HDA_REG_FIELD_MASK(SDFMT,MULT)) >> HDA_REG_FIELD_SHIFT(SDFMT, MULT))
    385 #define SDFMT_DIV(pState, num) ((SDFMT((pState), num) & HDA_REG_FIELD_MASK(SDFMT,DIV)) >> HDA_REG_FIELD_SHIFT(SDFMT, DIV))
    386 
    387 #define ICH6_HDA_REG_SD0BDPL     40 /* 0x98 */
    388 #define ICH6_HDA_REG_SD1BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 10) /* 0xB8 */
    389 #define ICH6_HDA_REG_SD2BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 20) /* 0xD8 */
    390 #define ICH6_HDA_REG_SD3BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 30) /* 0xF8 */
    391 #define ICH6_HDA_REG_SD4BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 40) /* 0x118 */
    392 #define ICH6_HDA_REG_SD5BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 50) /* 0x138 */
    393 #define ICH6_HDA_REG_SD6BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 60) /* 0x158 */
    394 #define ICH6_HDA_REG_SD7BDPL     (HDA_STREAM_REG_DEF(BDPL, 0) + 70) /* 0x178 */
    395 
    396 #define SDBDPL(pState, num) HDA_REG((pState), SD(BDPL, num))
    397 
    398 #define ICH6_HDA_REG_SD0BDPU     41 /* 0x9C */
    399 #define ICH6_HDA_REG_SD1BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 10) /* 0xBC */
    400 #define ICH6_HDA_REG_SD2BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 20) /* 0xDC */
    401 #define ICH6_HDA_REG_SD3BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 30) /* 0xFC */
    402 #define ICH6_HDA_REG_SD4BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 40) /* 0x11C */
    403 #define ICH6_HDA_REG_SD5BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 50) /* 0x13C */
    404 #define ICH6_HDA_REG_SD6BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 60) /* 0x15C */
    405 #define ICH6_HDA_REG_SD7BDPU     (HDA_STREAM_REG_DEF(BDPU, 0) + 70) /* 0x17C */
    406 
    407 #define SDBDPU(pState, num) HDA_REG((pState), SD(BDPU, num))
    408 
    409 
     385#define SDFMT_MULT(pState, num)     ((SDFMT((pState), num) & HDA_REG_FIELD_MASK(SDFMT,MULT)) >> HDA_REG_FIELD_SHIFT(SDFMT, MULT))
     386#define SDFMT_DIV(pState, num)      ((SDFMT((pState), num) & HDA_REG_FIELD_MASK(SDFMT,DIV)) >> HDA_REG_FIELD_SHIFT(SDFMT, DIV))
     387
     388#define ICH6_HDA_REG_SD0BDPL        40 /* 0x98 */
     389#define ICH6_HDA_REG_SD1BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 10) /* 0xB8 */
     390#define ICH6_HDA_REG_SD2BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 20) /* 0xD8 */
     391#define ICH6_HDA_REG_SD3BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 30) /* 0xF8 */
     392#define ICH6_HDA_REG_SD4BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 40) /* 0x118 */
     393#define ICH6_HDA_REG_SD5BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 50) /* 0x138 */
     394#define ICH6_HDA_REG_SD6BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 60) /* 0x158 */
     395#define ICH6_HDA_REG_SD7BDPL        (HDA_STREAM_REG_DEF(BDPL, 0) + 70) /* 0x178 */
     396
     397#define SDBDPL(pState, num)         HDA_REG((pState), SD(BDPL, num))
     398
     399#define ICH6_HDA_REG_SD0BDPU        41 /* 0x9C */
     400#define ICH6_HDA_REG_SD1BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 10) /* 0xBC */
     401#define ICH6_HDA_REG_SD2BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 20) /* 0xDC */
     402#define ICH6_HDA_REG_SD3BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 30) /* 0xFC */
     403#define ICH6_HDA_REG_SD4BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 40) /* 0x11C */
     404#define ICH6_HDA_REG_SD5BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 50) /* 0x13C */
     405#define ICH6_HDA_REG_SD6BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 60) /* 0x15C */
     406#define ICH6_HDA_REG_SD7BDPU        (HDA_STREAM_REG_DEF(BDPU, 0) + 70) /* 0x17C */
     407
     408#define SDBDPU(pState, num)         HDA_REG((pState), SD(BDPU, num))
     409
     410
     411/*******************************************************************************
     412*   Structures and Typedefs                                                    *
     413*******************************************************************************/
    410414typedef struct HDABDLEDESC
    411415{
     
    420424} HDABDLEDESC, *PHDABDLEDESC;
    421425
    422 
    423 /** HDABDLEDESC field descriptors the v3+ saved state. */
    424 static SSMFIELD const g_aHdaBDLEDescFields[] =
    425 {
    426     SSMFIELD_ENTRY(     HDABDLEDESC, u64BdleCviAddr),
    427     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleMaxCvi),
    428     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCvi),
    429     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviLen),
    430     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviPos),
    431     SSMFIELD_ENTRY(     HDABDLEDESC, fBdleCviIoc),
    432     SSMFIELD_ENTRY(     HDABDLEDESC, cbUnderFifoW),
    433     SSMFIELD_ENTRY(     HDABDLEDESC, au8HdaBuffer),
    434     SSMFIELD_ENTRY_TERM()
    435 };
    436 
    437 /** HDABDLEDESC field descriptors the v1 and v2 saved state. */
    438 static SSMFIELD const g_aHdaBDLEDescFieldsOld[] =
    439 {
    440     SSMFIELD_ENTRY(     HDABDLEDESC, u64BdleCviAddr),
    441     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleMaxCvi),
    442     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCvi),
    443     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviLen),
    444     SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviPos),
    445     SSMFIELD_ENTRY(     HDABDLEDESC, fBdleCviIoc),
    446     SSMFIELD_ENTRY_PAD_HC_AUTO(3, 3),
    447     SSMFIELD_ENTRY(     HDABDLEDESC, cbUnderFifoW),
    448     SSMFIELD_ENTRY(     HDABDLEDESC, au8HdaBuffer),
    449     SSMFIELD_ENTRY_TERM()
    450 };
    451 
    452426typedef struct HDASTREAMTRANSFERDESC
    453427{
     
    471445    /** The base interface for LUN\#0. */
    472446    PDMIBASE                IBase;
    473     RTGCPHYS    addrMMReg;
    474     uint32_t     au32Regs[HDA_NREGS];
    475     HDABDLEDESC  stInBdle;
    476     HDABDLEDESC  stOutBdle;
    477     HDABDLEDESC  stMicBdle;
    478     /* Interrupt on completion */
    479     bool        fCviIoc;
    480     uint64_t    u64CORBBase;
    481     uint64_t    u64RIRBBase;
    482     uint64_t    u64DPBase;
    483     /* pointer to CORB buf */
    484     uint32_t    *pu32CorbBuf;
    485     /* size in bytes of CORB buf */
    486     uint32_t    cbCorbBuf;
    487     /* pointer on RIRB buf */
    488     uint64_t    *pu64RirbBuf;
    489     /* size in bytes of RIRB buf */
    490     uint32_t    cbRirbBuf;
    491     /* indicates if HDA in reset. */
    492     bool        fInReset;
    493     CODECState  Codec;
    494     uint8_t     u8Counter;
    495     uint64_t    u64BaseTS;
     447    RTGCPHYS                addrMMReg;
     448    uint32_t                au32Regs[HDA_NREGS];
     449    HDABDLEDESC             stInBdle;
     450    HDABDLEDESC             stOutBdle;
     451    HDABDLEDESC             stMicBdle;
     452    /** Interrupt on completion */
     453    bool                    fCviIoc;
     454    uint64_t                u64CORBBase;
     455    uint64_t                u64RIRBBase;
     456    uint64_t                u64DPBase;
     457    /** pointer to CORB buf */
     458    uint32_t               *pu32CorbBuf;
     459    /** size in bytes of CORB buf */
     460    uint32_t                cbCorbBuf;
     461    /** pointer on RIRB buf */
     462    uint64_t               *pu64RirbBuf;
     463    /** size in bytes of RIRB buf */
     464    uint32_t                cbRirbBuf;
     465    /** indicates if HDA in reset. */
     466    bool                    fInReset;
     467    CODECState              Codec;
     468    uint8_t                 u8Counter;
     469    uint64_t                u64BaseTS;
    496470} INTELHDLinkState, *PINTELHDLinkState;
    497471
     
    505479
    506480
    507 
    508 
    509481typedef struct PCIINTELHDLinkState
    510482{
     
    513485} PCIINTELHDLinkState;
    514486
     487
     488/*******************************************************************************
     489*   Internal Functions                                                         *
     490*******************************************************************************/
     491static FNPDMDEVRESET hdaReset;
    515492
    516493/** @todo r=bird: Why aren't these static? And why use DECLCALLBACK for
     
    554531DECLCALLBACK(int) hdaRegWriteU8(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t pu32Value);
    555532
    556 DECLINLINE(void) hdaInitTransferDescriptor(PINTELHDLinkState pState, PHDABDLEDESC pBdle, uint8_t u8Strm, PHDASTREAMTRANSFERDESC pStreamDesc);
    557 static int hdaMMIORegLookup(INTELHDLinkState* pState, uint32_t u32Offset);
     533DECLINLINE(void) hdaInitTransferDescriptor(PINTELHDLinkState pState, PHDABDLEDESC pBdle, uint8_t u8Strm,
     534                                           PHDASTREAMTRANSFERDESC pStreamDesc);
     535static int hdaMMIORegLookup(INTELHDLinkState* pState, uint32_t offReg);
    558536static void hdaFetchBdle(INTELHDLinkState *pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc);
    559537#ifdef LOG_ENABLED
     
    562540
    563541
     542/*******************************************************************************
     543*   Global Variables                                                           *
     544*******************************************************************************/
    564545/* see 302349 p 6.2*/
    565 const static struct stIchIntelHDRegMap
     546static const struct
    566547{
    567548    /** Register offset in the register space. */
    568     uint32_t   offset;
     549    uint32_t    offset;
    569550    /** Size in bytes. Registers of size > 4 are in fact tables. */
    570     uint32_t   size;
     551    uint32_t    size;
    571552    /** Readable bits. */
    572     uint32_t readable;
     553    uint32_t    readable;
    573554    /** Writable bits. */
    574     uint32_t writable;
     555    uint32_t    writable;
    575556    /** Read callback. */
    576     int       (*pfnRead)(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);
     557    int       (*pfnRead)(INTELHDLinkState *pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    577558    /** Write callback. */
    578     int       (*pfnWrite)(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value);
     559    int       (*pfnWrite)(INTELHDLinkState *pState, uint32_t offset, uint32_t index, uint32_t u32Value);
    579560    /** Abbreviated name. */
    580561    const char *abbrev;
    581562    /** Full name. */
    582563    const char *name;
    583 } s_ichIntelHDRegMap[HDA_NREGS] =
     564} g_aIchIntelHDRegMap[HDA_NREGS] =
    584565{
    585566    /* offset  size     read mask   write mask         read callback         write callback         abbrev      full name                     */
     
    708689};
    709690
    710 static void inline hdaUpdatePosBuf(INTELHDLinkState *pState, PHDASTREAMTRANSFERDESC pStreamDesc)
     691/** HDABDLEDESC field descriptors the v3+ saved state. */
     692static SSMFIELD const g_aHdaBDLEDescFields[] =
     693{
     694    SSMFIELD_ENTRY(     HDABDLEDESC, u64BdleCviAddr),
     695    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleMaxCvi),
     696    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCvi),
     697    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviLen),
     698    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviPos),
     699    SSMFIELD_ENTRY(     HDABDLEDESC, fBdleCviIoc),
     700    SSMFIELD_ENTRY(     HDABDLEDESC, cbUnderFifoW),
     701    SSMFIELD_ENTRY(     HDABDLEDESC, au8HdaBuffer),
     702    SSMFIELD_ENTRY_TERM()
     703};
     704
     705/** HDABDLEDESC field descriptors the v1 and v2 saved state. */
     706static SSMFIELD const g_aHdaBDLEDescFieldsOld[] =
     707{
     708    SSMFIELD_ENTRY(     HDABDLEDESC, u64BdleCviAddr),
     709    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleMaxCvi),
     710    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCvi),
     711    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviLen),
     712    SSMFIELD_ENTRY(     HDABDLEDESC, u32BdleCviPos),
     713    SSMFIELD_ENTRY(     HDABDLEDESC, fBdleCviIoc),
     714    SSMFIELD_ENTRY_PAD_HC_AUTO(3, 3),
     715    SSMFIELD_ENTRY(     HDABDLEDESC, cbUnderFifoW),
     716    SSMFIELD_ENTRY(     HDABDLEDESC, au8HdaBuffer),
     717    SSMFIELD_ENTRY_TERM()
     718};
     719
     720
     721DECLINLINE(void) hdaUpdatePosBuf(INTELHDLinkState *pState, PHDASTREAMTRANSFERDESC pStreamDesc)
    711722{
    712723    if (pState->u64DPBase & DPBASE_ENABLED)
     
    714725                       (pState->u64DPBase & DPBASE_ADDR_MASK) + pStreamDesc->u8Strm*8, pStreamDesc->pu32Lpib, sizeof(uint32_t));
    715726}
    716 static uint32_t inline hdaFifoWToSz(INTELHDLinkState *pState, PHDASTREAMTRANSFERDESC pStreamDesc)
     727DECLINLINE(uint32_t) hdaFifoWToSz(INTELHDLinkState *pState, PHDASTREAMTRANSFERDESC pStreamDesc)
    717728{
    718729#if 0
     
    753764}
    754765
    755 static int hdaMMIORegLookup(INTELHDLinkState* pState, uint32_t u32Offset)
    756 {
    757     int idxMiddle;
    758     int idxHigh = RT_ELEMENTS(s_ichIntelHDRegMap);
    759     int idxLow = 0;
    760     /* Aliases HDA spec 3.3.45 */
    761     switch(u32Offset)
     766static int hdaMMIORegLookup(INTELHDLinkState* pState, uint32_t offReg)
     767{
     768    /*
     769     * Aliases HDA spec 3.3.45
     770     */
     771    switch (offReg)
    762772    {
    763773        case 0x2084:
     
    778788            return HDA_REG_IND_NAME(SD7LPIB);
    779789    }
    780     while (1)
     790
     791    /*
     792     * Binary search the
     793     */
     794    int idxHigh = RT_ELEMENTS(g_aIchIntelHDRegMap);
     795    int idxLow  = 0;
     796    for (;;)
    781797    {
    782798#ifdef DEBUG_vvl
    783             Assert((   idxHigh >= 0
    784                     && idxLow >= 0));
     799            Assert(   idxHigh >= 0
     800                   && idxLow  >= 0);
    785801#endif
    786802            if (   idxHigh < idxLow
    787803                || idxHigh < 0)
    788804                break;
    789             idxMiddle = idxLow + (idxHigh - idxLow)/2;
    790             if (u32Offset < s_ichIntelHDRegMap[idxMiddle].offset)
    791             {
     805            int idxMiddle = idxLow + (idxHigh - idxLow) / 2;
     806            if (offReg < g_aIchIntelHDRegMap[idxMiddle].offset)
    792807                idxHigh = idxMiddle - 1;
    793                 continue;
    794             }
    795             if (u32Offset >= s_ichIntelHDRegMap[idxMiddle].offset + s_ichIntelHDRegMap[idxMiddle].size)
    796             {
    797                 idxLow = idxMiddle + 1;
    798                 continue;
    799             }
    800             if (   u32Offset >= s_ichIntelHDRegMap[idxMiddle].offset
    801                 && u32Offset < s_ichIntelHDRegMap[idxMiddle].offset + s_ichIntelHDRegMap[idxMiddle].size)
     808            else if (offReg >= g_aIchIntelHDRegMap[idxMiddle].offset + g_aIchIntelHDRegMap[idxMiddle].size)
     809                idxLow  = idxMiddle + 1;
     810            else if (   offReg >= g_aIchIntelHDRegMap[idxMiddle].offset
     811                     && offReg < g_aIchIntelHDRegMap[idxMiddle].offset + g_aIchIntelHDRegMap[idxMiddle].size)
    802812                return idxMiddle;
    803813    }
     
    967977DECLCALLBACK(int) hdaRegReadU8(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    968978{
    969     Assert(((pState->au32Regs[index] & s_ichIntelHDRegMap[index].readable) & 0xffffff00) == 0);
     979    Assert(((pState->au32Regs[index] & g_aIchIntelHDRegMap[index].readable) & 0xffffff00) == 0);
    970980    return hdaRegReadU32(pState, offset, index, pu32Value);
    971981}
     
    979989DECLCALLBACK(int) hdaRegReadU16(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    980990{
    981     Assert(((pState->au32Regs[index] & s_ichIntelHDRegMap[index].readable) & 0xffff0000) == 0);
     991    Assert(((pState->au32Regs[index] & g_aIchIntelHDRegMap[index].readable) & 0xffff0000) == 0);
    982992    return hdaRegReadU32(pState, offset, index, pu32Value);
    983993}
     
    9921002DECLCALLBACK(int) hdaRegReadU24(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    9931003{
    994     Assert(((pState->au32Regs[index] & s_ichIntelHDRegMap[index].readable) & 0xff000000) == 0);
     1004    Assert(((pState->au32Regs[index] & g_aIchIntelHDRegMap[index].readable) & 0xff000000) == 0);
    9951005    return hdaRegReadU32(pState, offset, index, pu32Value);
    9961006}
     
    10041014DECLCALLBACK(int) hdaRegReadU32(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    10051015{
    1006     *pu32Value = pState->au32Regs[index] & s_ichIntelHDRegMap[index].readable;
     1016    *pu32Value = pState->au32Regs[index] & g_aIchIntelHDRegMap[index].readable;
    10071017    return VINF_SUCCESS;
    10081018}
     
    10101020DECLCALLBACK(int) hdaRegWriteU32(INTELHDLinkState* pState, uint32_t offset, uint32_t index, uint32_t u32Value)
    10111021{
    1012     pState->au32Regs[index]  = (u32Value & s_ichIntelHDRegMap[index].writable)
    1013                                   | (pState->au32Regs[index] & ~s_ichIntelHDRegMap[index].writable);
     1022    pState->au32Regs[index]  = (u32Value & g_aIchIntelHDRegMap[index].writable)
     1023                                  | (pState->au32Regs[index] & ~g_aIchIntelHDRegMap[index].writable);
    10141024    return VINF_SUCCESS;
    10151025}
     
    10881098{
    10891099    /* HDA spec (1a): 3.3.16 WALCLK counter ticks with 24Mhz bitclock rate. */
    1090     *pu32Value = (uint32_t)ASMMultU64ByU32DivByU32(PDMDevHlpTMTimeVirtGetNano(ICH6_HDASTATE_2_DEVINS(pState)) - pState->u64BaseTS, 24, 1000);
     1100    *pu32Value = (uint32_t)ASMMultU64ByU32DivByU32(PDMDevHlpTMTimeVirtGetNano(ICH6_HDASTATE_2_DEVINS(pState))
     1101                                                   - pState->u64BaseTS, 24, 1000);
    10911102    return VINF_SUCCESS;
    10921103}
     
    11561167        Assert((!fReset));
    11571168        Log(("hda: guest initiated exit of stream reset.\n"));
    1158         goto done;
     1169        goto l_done;
    11591170    }
    11601171    else if (fReset)
     
    11651176        uint8_t u8Strm = 0;
    11661177        PHDABDLEDESC pBdle = NULL;
    1167         HDASTREAMTRANSFERDESC stStreamDesc;
     1178        HDASTREAMTRANSFERDESC StreamDesc;
    11681179        Assert((!fInRun && !fRun));
    11691180        switch (index)
     
    11721183                u8Strm = 0;
    11731184                pBdle = &pState->stInBdle;
    1174             break;
     1185                break;
    11751186            case ICH6_HDA_REG_SD4CTL:
    11761187                u8Strm = 4;
    11771188                pBdle = &pState->stOutBdle;
    1178             break;
     1189                break;
    11791190            default:
    11801191                Log(("hda: changing SRST bit on non-attached stream\n"));
    1181                 goto done;
     1192                goto l_done;
    11821193        }
    11831194        Log(("hda: guest initiated enter to stream reset.\n"));
    1184         hdaInitTransferDescriptor(pState, pBdle, u8Strm, &stStreamDesc);
    1185         hdaStreamReset(pState, pBdle, &stStreamDesc, u8Strm);
    1186         goto done;
     1195        hdaInitTransferDescriptor(pState, pBdle, u8Strm, &StreamDesc);
     1196        hdaStreamReset(pState, pBdle, &StreamDesc, u8Strm);
     1197        goto l_done;
    11871198    }
    11881199
     
    12021213            default:
    12031214                Log(("hda: changing RUN bit on non-attached stream\n"));
    1204                 goto done;
     1215                goto l_done;
    12051216        }
    12061217    }
    12071218
    1208     done:
     1219l_done:
    12091220    rc = hdaRegWriteU24(pState, offset, index, u32Value);
    12101221    if (RT_FAILURE(rc))
     
    12841295}
    12851296
    1286 static void inline hdaSdFmtToAudSettings(uint32_t u32SdFmt, audsettings_t *pAudSetting)
     1297static void hdaSdFmtToAudSettings(uint32_t u32SdFmt, audsettings_t *pAudSetting)
    12871298{
    12881299    Assert((pAudSetting));
     
    15461557}
    15471558
    1548 static inline uint32_t hdaCalculateTransferBufferLength(PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc, uint32_t u32SoundBackendBufferBytesAvail, uint32_t u32CblLimit)
     1559DECLINLINE(uint32_t) hdaCalculateTransferBufferLength(PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc,
     1560                                                      uint32_t u32SoundBackendBufferBytesAvail, uint32_t u32CblLimit)
    15491561{
    15501562    uint32_t cb2Copy;
     
    15701582}
    15711583
    1572 DECLINLINE(void) hdaBackendWriteTransferReported(PHDABDLEDESC pBdle, uint32_t cbArranged2Copy, uint32_t cbCopied, uint32_t *pu32DMACursor, uint32_t *pu32BackendBufferCapacity)
     1584DECLINLINE(void) hdaBackendWriteTransferReported(PHDABDLEDESC pBdle, uint32_t cbArranged2Copy, uint32_t cbCopied,
     1585                                                 uint32_t *pu32DMACursor, uint32_t *pu32BackendBufferCapacity)
    15731586{
    15741587    Log(("hda:hdaBackendWriteTransferReported: cbArranged2Copy: %d, cbCopied: %d, pu32DMACursor: %d, pu32BackendBufferCapacity:%d\n",
     
    16001613}
    16011614
    1602 DECLINLINE(void) hdaBackendReadTransferReported(PHDABDLEDESC pBdle, uint32_t cbArranged2Copy, uint32_t cbCopied, uint32_t *pu32DMACursor, uint32_t *pu32BackendBufferCapacity)
     1615DECLINLINE(void) hdaBackendReadTransferReported(PHDABDLEDESC pBdle, uint32_t cbArranged2Copy, uint32_t cbCopied,
     1616                                                uint32_t *pu32DMACursor, uint32_t *pu32BackendBufferCapacity)
    16031617{
    16041618    Assert((cbCopied, cbArranged2Copy));
     
    16121626}
    16131627
    1614 DECLINLINE(void) hdaBackendTransferUnreported(INTELHDLinkState *pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc, uint32_t cbCopied, uint32_t *pu32BackendBufferCapacity)
     1628DECLINLINE(void) hdaBackendTransferUnreported(INTELHDLinkState *pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc,
     1629                                              uint32_t cbCopied, uint32_t *pu32BackendBufferCapacity)
    16151630{
    16161631    Log(("hda:hdaBackendTransferUnreported: CVI (cbUnderFifoW:%d, pos:%d, len:%d)\n", pBdle->cbUnderFifoW, pBdle->u32BdleCviPos, pBdle->u32BdleCviLen));
     
    16231638    Assert((pBdle->cbUnderFifoW <= hdaFifoWToSz(pState, pStreamDesc)));
    16241639}
    1625 static inline bool hdaIsTransferCountersOverlapped(PINTELHDLinkState pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc)
     1640
     1641DECLINLINE(bool) hdaIsTransferCountersOverlapped(PINTELHDLinkState pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc)
    16261642{
    16271643    bool fOnBufferEdge = (   *pStreamDesc->pu32Lpib == pStreamDesc->u32Cbl
     
    16461662}
    16471663
    1648 DECLINLINE(void) hdaStreamCounterUpdate(PINTELHDLinkState pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc, uint32_t cbInc)
     1664DECLINLINE(void) hdaStreamCounterUpdate(PINTELHDLinkState pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc,
     1665                                        uint32_t cbInc)
    16491666{
    16501667    /*
     
    16661683}
    16671684
    1668 static inline bool hdaDoNextTransferCycle(PINTELHDLinkState pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc)
     1685static bool hdaDoNextTransferCycle(PINTELHDLinkState pState, PHDABDLEDESC pBdle, PHDASTREAMTRANSFERDESC pStreamDesc)
    16691686{
    16701687    bool fDoNextTransferLoop = true;
     
    17111728        /* if we enter here we can't report "unreported bits" */
    17121729        *fStop = true;
    1713         goto done;
     1730        goto l_done;
    17141731    }
    17151732
     
    17341751        *fStop = true;
    17351752    }
    1736     done:
     1753l_done:
    17371754    Assert((cbTransferred <= (SDFIFOS(pState, 0) + 1)));
    17381755    Log(("hda:ra: CVI(pos:%d, len:%d) cbTransferred: %d\n", pBdle->u32BdleCviPos, pBdle->u32BdleCviLen, cbTransferred));
     
    17571774    {
    17581775        *fStop = true;
    1759         goto done;
     1776        goto l_done;
    17601777    }
    17611778
     
    17791796    }
    17801797
    1781     done:
     1798l_done:
    17821799    Assert((cbTransferred <= (SDFIFOS(pState, 4) + 1)));
    17831800    Log(("hda:wa: CVI(pos:%d, len:%d, cbTransferred:%d)\n", pBdle->u32BdleCviPos, pBdle->u32BdleCviLen, cbTransferred));
     
    17851802}
    17861803
     1804/**
     1805 * @interface_method_impl{HDACODEC,pfnReset}
     1806 */
    17871807DECLCALLBACK(int) hdaCodecReset(CODECState *pCodecState)
    17881808{
    1789     INTELHDLinkState *pState = (INTELHDLinkState *)pCodecState->pHDAState;
     1809    INTELHDLinkState *pState = (INTELHDLinkState *)pCodecState->pvHDAState;
    17901810    return VINF_SUCCESS;
    17911811}
    17921812
    1793 DECLINLINE(void) hdaInitTransferDescriptor(PINTELHDLinkState pState, PHDABDLEDESC pBdle, uint8_t u8Strm, PHDASTREAMTRANSFERDESC pStreamDesc)
    1794 {
    1795     Assert((   pState
    1796             && pBdle
    1797             && pStreamDesc
    1798             && u8Strm <= 7));
     1813DECLINLINE(void) hdaInitTransferDescriptor(PINTELHDLinkState pState, PHDABDLEDESC pBdle, uint8_t u8Strm,
     1814                                           PHDASTREAMTRANSFERDESC pStreamDesc)
     1815{
     1816    Assert(pState); Assert(pBdle); Assert(pStreamDesc); Assert(u8Strm <= 7);
     1817
    17991818    memset(pStreamDesc, 0, sizeof(HDASTREAMTRANSFERDESC));
    1800     pStreamDesc->u8Strm = u8Strm;
    1801     pStreamDesc->u32Ctl = HDA_STREAM_REG2(pState, CTL, u8Strm);
     1819    pStreamDesc->u8Strm     = u8Strm;
     1820    pStreamDesc->u32Ctl     = HDA_STREAM_REG2(pState, CTL, u8Strm);
    18021821    pStreamDesc->u64BaseDMA = RT_MAKE_U64(HDA_STREAM_REG2(pState, BDPL, u8Strm),
    18031822                                          HDA_STREAM_REG2(pState, BDPU, u8Strm));
    1804     pStreamDesc->pu32Lpib = &HDA_STREAM_REG2(pState, LPIB, u8Strm);
    1805     pStreamDesc->pu32Sts = &HDA_STREAM_REG2(pState, STS, u8Strm);
    1806     pStreamDesc->u32Cbl = HDA_STREAM_REG2(pState, CBL, u8Strm);
    1807     pStreamDesc->u32Fifos = HDA_STREAM_REG2(pState, FIFOS, u8Strm);
    1808 
    1809     pBdle->u32BdleMaxCvi = HDA_STREAM_REG2(pState, LVI, u8Strm);
     1823    pStreamDesc->pu32Lpib   = &HDA_STREAM_REG2(pState, LPIB, u8Strm);
     1824    pStreamDesc->pu32Sts    = &HDA_STREAM_REG2(pState, STS, u8Strm);
     1825    pStreamDesc->u32Cbl     = HDA_STREAM_REG2(pState, CBL, u8Strm);
     1826    pStreamDesc->u32Fifos   = HDA_STREAM_REG2(pState, FIFOS, u8Strm);
     1827
     1828    pBdle->u32BdleMaxCvi    = HDA_STREAM_REG2(pState, LVI, u8Strm);
     1829
    18101830#ifdef LOG_ENABLED
    18111831    if (   pBdle
     
    18181838}
    18191839
    1820 DECLCALLBACK(void) hdaTransfer(CODECState *pCodecState, ENMSOUNDSOURCE src, int avail)
    1821 {
    1822     bool fStop = false;
    1823     uint8_t u8Strm = 0;
    1824     PHDABDLEDESC pBdle = NULL;
    1825     INTELHDLinkState *pState = (INTELHDLinkState *)pCodecState->pHDAState;
    1826     HDASTREAMTRANSFERDESC stStreamDesc;
    1827     uint32_t nBytes;
     1840
     1841/**
     1842 * @interface_method_impl{HDACODEC,pfnTransfer}
     1843 */
     1844static DECLCALLBACK(void) hdaTransfer(CODECState *pCodecState, ENMSOUNDSOURCE src, int avail)
     1845{
     1846    INTELHDLinkState *pState = (INTELHDLinkState *)pCodecState->pvHDAState;
     1847    uint8_t                 u8Strm = 0;
     1848    PHDABDLEDESC            pBdle = NULL;
     1849
    18281850    switch (src)
    18291851    {
     
    18431865            return;
    18441866    }
    1845     hdaInitTransferDescriptor(pState, pBdle, u8Strm, &stStreamDesc);
    1846     while( avail && !fStop)
    1847     {
    1848         Assert (   (stStreamDesc.u32Ctl & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN))
    1849                 && avail
    1850                 && stStreamDesc.u64BaseDMA);
     1867
     1868    HDASTREAMTRANSFERDESC StreamDesc;
     1869    hdaInitTransferDescriptor(pState, pBdle, u8Strm, &StreamDesc);
     1870
     1871    bool fStop = false;
     1872    while (avail && !fStop)
     1873    {
     1874        Assert(   (StreamDesc.u32Ctl & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN))
     1875               && avail
     1876               && StreamDesc.u64BaseDMA);
    18511877
    18521878        /* Fetch the Buffer Descriptor Entry (BDE). */
    18531879
    1854         if (hdaIsTransferCountersOverlapped(pState, pBdle, &stStreamDesc))
    1855             hdaFetchBdle(pState, pBdle, &stStreamDesc);
    1856         *stStreamDesc.pu32Sts |= HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY);
    1857         Assert((avail >= 0 && (stStreamDesc.u32Cbl >= (*stStreamDesc.pu32Lpib)))); /* sanity */
    1858         uint32_t u32CblLimit = stStreamDesc.u32Cbl - (*stStreamDesc.pu32Lpib);
    1859         Assert((u32CblLimit > hdaFifoWToSz(pState, &stStreamDesc)));
    1860         Log(("hda: CBL=%d, LPIB=%d\n", stStreamDesc.u32Cbl, *stStreamDesc.pu32Lpib));
     1880        if (hdaIsTransferCountersOverlapped(pState, pBdle, &StreamDesc))
     1881            hdaFetchBdle(pState, pBdle, &StreamDesc);
     1882        *StreamDesc.pu32Sts |= HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY);
     1883        Assert((avail >= 0 && (StreamDesc.u32Cbl >= (*StreamDesc.pu32Lpib)))); /* sanity */
     1884        uint32_t u32CblLimit = StreamDesc.u32Cbl - (*StreamDesc.pu32Lpib);
     1885        Assert((u32CblLimit > hdaFifoWToSz(pState, &StreamDesc)));
     1886        Log(("hda: CBL=%d, LPIB=%d\n", StreamDesc.u32Cbl, *StreamDesc.pu32Lpib));
     1887        uint32_t cb;
    18611888        switch (src)
    18621889        {
    18631890            case PO_INDEX:
    1864                 nBytes = hdaWriteAudio(pState, &stStreamDesc, (uint32_t *)&avail, &fStop, u32CblLimit);
     1891                cb = hdaWriteAudio(pState, &StreamDesc, (uint32_t *)&avail, &fStop, u32CblLimit);
    18651892                break;
    18661893            case PI_INDEX:
    1867                 nBytes = hdaReadAudio(pState, &stStreamDesc, (uint32_t *)&avail, &fStop, u32CblLimit);
     1894                cb = hdaReadAudio(pState, &StreamDesc, (uint32_t *)&avail, &fStop, u32CblLimit);
    18681895                break;
    18691896            default:
    1870                 nBytes = 0;
    1871                 fStop  = true;
     1897                cb = 0;
     1898                fStop = true;
    18721899                AssertMsgFailed(("Unsupported"));
    18731900        }
    1874         Assert(nBytes <= (stStreamDesc.u32Fifos + 1));
    1875         *stStreamDesc.pu32Sts &= ~HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY);
     1901        Assert(cb <= StreamDesc.u32Fifos + 1);
     1902        *StreamDesc.pu32Sts &= ~HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY);
    18761903
    18771904        /* Process end of buffer condition. */
    1878         hdaStreamCounterUpdate(pState, pBdle, &stStreamDesc, nBytes);
    1879         fStop = !fStop ? !hdaDoNextTransferCycle(pState, pBdle, &stStreamDesc) : fStop;
    1880     }
    1881 }
     1905        hdaStreamCounterUpdate(pState, pBdle, &StreamDesc, cb);
     1906        fStop = !fStop ? !hdaDoNextTransferCycle(pState, pBdle, &StreamDesc) : fStop;
     1907    }
     1908}
     1909
     1910
     1911/* MMIO callbacks */
    18821912
    18831913/**
    1884  * Handle register read operation.
     1914 * @callback_method_impl{FNIOMMMIOREAD, Looks up and calls the appropriate handler.}
    18851915 *
    1886  * Looks up and calls the appropriate handler.
    1887  *
    1888  * @note: During implementation, we discovered so-called "forgotten" or "hole" registers
    1889  * whose description is not listed in the RPM, datasheet, or spec.
    1890  *
    1891  * @returns VBox status code.
    1892  *
    1893  * @param   pState      The device state structure.
    1894  * @param   uOffset     Register offset in memory-mapped area.
    1895  * @param   pv          Where to place the value.
    1896  * @param   cb          Number of bytes to write.
    1897  * @thread  EMT
     1916 * @note During implementation, we discovered so-called "forgotten" or "hole"
     1917 *       registers whose description is not listed in the RPM, datasheet, or
     1918 *       spec.
    18981919 */
    18991920PDMBOTHCBDECL(int) hdaMMIORead(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void *pv, unsigned cb)
     
    19151936         *        what the rules are. */
    19161937        uint32_t mask = 0;
    1917         uint32_t shift = (s_ichIntelHDRegMap[idxReg].offset - offReg) % sizeof(uint32_t) * 8;
     1938        uint32_t shift = (g_aIchIntelHDRegMap[idxReg].offset - offReg) % sizeof(uint32_t) * 8;
    19181939        uint32_t u32Value = 0;
    19191940        switch(cb)
     
    19311952        /* Cross-register access. Mac guest hits this assert doing assumption 4 byte access to 3 byte registers e.g. {I,O}SDnCTL
    19321953         */
    1933         //Assert((cb <= s_ichIntelHDRegMap[idxReg].size - (offReg - s_ichIntelHDRegMap[idxReg].offset)));
    1934         if (cb > s_ichIntelHDRegMap[idxReg].size - (offReg - s_ichIntelHDRegMap[idxReg].offset))
     1954        //Assert((cb <= g_aIchIntelHDRegMap[idxReg].size - (offReg - g_aIchIntelHDRegMap[idxReg].offset)));
     1955        if (cb > g_aIchIntelHDRegMap[idxReg].size - (offReg - g_aIchIntelHDRegMap[idxReg].offset))
    19351956        {
    1936             int off = cb - (s_ichIntelHDRegMap[idxReg].size - (offReg - s_ichIntelHDRegMap[idxReg].offset));
     1957            int off = cb - (g_aIchIntelHDRegMap[idxReg].size - (offReg - g_aIchIntelHDRegMap[idxReg].offset));
    19371958            rc = hdaMMIORead(pDevIns, pvUser, GCPhysAddr + cb - off, (char *)pv + cb - off, off);
    19381959            if (RT_FAILURE(rc))
    19391960                AssertRCReturn (rc, rc);
    19401961        }
    1941         //Assert(((offReg - s_ichIntelHDRegMap[idxReg].offset) == 0));
     1962        //Assert(((offReg - g_aIchIntelHDRegMap[idxReg].offset) == 0));
    19421963#endif
    19431964        mask <<= shift;
    1944         rc = s_ichIntelHDRegMap[idxReg].pfnRead(&pThis->hda, offReg, idxReg, &u32Value);
     1965        rc = g_aIchIntelHDRegMap[idxReg].pfnRead(&pThis->hda, offReg, idxReg, &u32Value);
    19451966        *(uint32_t *)pv |= (u32Value & mask);
    1946         Log(("hda: read %s[%x/%x]\n", s_ichIntelHDRegMap[idxReg].abbrev, u32Value, *(uint32_t *)pv));
     1967        Log(("hda: read %s[%x/%x]\n", g_aIchIntelHDRegMap[idxReg].abbrev, u32Value, *(uint32_t *)pv));
    19471968        return rc;
    19481969    }
     
    19521973}
    19531974
     1975
    19541976/**
    1955  * Handle register write operation.
    1956  *
    1957  * Looks up and calls the appropriate handler.
    1958  *
    1959  * @returns VBox status code.
    1960  *
    1961  * @param   pState      The device state structure.
    1962  * @param   uOffset     Register offset in memory-mapped area.
    1963  * @param   pv          Where to fetch the value.
    1964  * @param   cb          Number of bytes to write.
    1965  * @thread  EMT
     1977 * @callback_method_impl{FNIOMMMIOWRITE, Looks up and calls the appropriate handler.}
    19661978 */
    19671979PDMBOTHCBDECL(int) hdaMMIOWrite(PPDMDEVINS pDevIns, void *pvUser, RTGCPHYS GCPhysAddr, void const *pv, unsigned cb)
     
    20192031        /* cross-register access, see corresponding comment in hdaMMIORead */
    20202032#if 0
    2021         if (cb > s_ichIntelHDRegMap[idxReg].size - (offReg - s_ichIntelHDRegMap[idxReg].offset))
     2033        if (cb > g_aIchIntelHDRegMap[idxReg].size - (offReg - g_aIchIntelHDRegMap[idxReg].offset))
    20222034        {
    2023             int off = cb - (s_ichIntelHDRegMap[idxReg].size - (offReg - s_ichIntelHDRegMap[idxReg].offset));
     2035            int off = cb - (g_aIchIntelHDRegMap[idxReg].size - (offReg - g_aIchIntelHDRegMap[idxReg].offset));
    20242036            rc = hdaMMIOWrite(pDevIns, pvUser, GCPhysAddr + cb - off, (char *)pv + cb - off, off);
    20252037            if (RT_FAILURE(rc))
     
    20272039        }
    20282040#endif
    2029         uint32_t shift = (s_ichIntelHDRegMap[idxReg].offset - offReg) % sizeof(uint32_t) * 8;
     2041        uint32_t shift = (g_aIchIntelHDRegMap[idxReg].offset - offReg) % sizeof(uint32_t) * 8;
    20302042        mask <<= shift;
    20312043        u32NewValue <<= shift;
     
    20332045        u32NewValue |= (u32CurValue & ~mask);
    20342046
    2035         rc = s_ichIntelHDRegMap[idxReg].pfnWrite(&pThis->hda, offReg, idxReg, u32NewValue);
    2036         Log(("hda: write %s:(%x) %x => %x\n", s_ichIntelHDRegMap[idxReg].abbrev, u32NewValue,
     2047        rc = g_aIchIntelHDRegMap[idxReg].pfnWrite(&pThis->hda, offReg, idxReg, u32NewValue);
     2048        Log(("hda: write %s:(%x) %x => %x\n", g_aIchIntelHDRegMap[idxReg].abbrev, u32NewValue,
    20372049             u32CurValue, pThis->hda.au32Regs[idxReg]));
    20382050        return rc;
     
    20432055}
    20442056
     2057
     2058/* PCI callback. */
     2059
    20452060/**
    2046  * Callback function for mapping a PCI I/O region.
    2047  *
    2048  * @return VBox status code.
    2049  * @param   pPciDev         Pointer to PCI device.
    2050  *                          Use pPciDev->pDevIns to get the device instance.
    2051  * @param   iRegion         The region number.
    2052  * @param   GCPhysAddress   Physical address of the region.
    2053  *                          If iType is PCI_ADDRESS_SPACE_IO, this is an
    2054  *                          I/O port, else it's a physical address.
    2055  *                          This address is *NOT* relative
    2056  *                          to pci_mem_base like earlier!
    2057  * @param   enmType         One of the PCI_ADDRESS_SPACE_* values.
     2061 * @callback_method_impl{FNPCIIOREGIONMAP}
    20582062 */
    2059 static DECLCALLBACK(int) hdaMap(PPCIDEVICE pPciDev, int iRegion,
    2060                                 RTGCPHYS GCPhysAddress, uint32_t cb,
    2061                                 PCIADDRESSSPACE enmType)
     2063static DECLCALLBACK(int) hdaMap(PPCIDEVICE pPciDev, int iRegion, RTGCPHYS GCPhysAddress, uint32_t cb, PCIADDRESSSPACE enmType)
    20622064{
    20632065    int         rc;
     
    20782080}
    20792081
     2082
     2083/* Saved state callbacks. */
     2084
    20802085/**
    2081  * Saves the state of the HDA device.
    2082  *
    2083  * @returns VBox status code.
    2084  * @param   pDevIns     The device instance.
    2085  * @param   pSSM        The handle to save the state to.
     2086 * @callback_method_impl{FNSSMDEVSAVEEXEC}
    20862087 */
    20872088static DECLCALLBACK(int) hdaSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM)
     
    21032104}
    21042105
     2106
    21052107/**
    2106  * Loads a saved HDA device state.
    2107  *
    2108  * @returns VBox status code.
    2109  * @param   pDevIns     The device instance.
    2110  * @param   pSSM        The handle to the saved state.
    2111  * @param   uVersion    The data unit version number.
    2112  * @param   uPass       The data pass.
     2108 * @callback_method_impl{FNSSMDEVLOADEXEC}
    21132109 */
    21142110static DECLCALLBACK(int) hdaLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass)
     
    21962192}
    21972193
     2194
     2195/* Debug and log type formatters. */
     2196
     2197/**
     2198 * @callback_method_impl{FNRTSTRFORMATTYPE}
     2199 */
     2200static DECLCALLBACK(size_t)
     2201hdaFormatStrmCtl(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
     2202                 const char *pszType, void const *pvValue,
     2203                 int cchWidth, int cchPrecision, unsigned fFlags,
     2204                 void *pvUser)
     2205{
     2206    uint32_t sdCtl = (uint32_t)(uintptr_t)pvValue;
     2207    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     2208                       "SDCTL(raw: %#x, strm:%#x, dir:%RTbool, tp:%RTbool strip:%x, deie:%RTbool, ioce:%RTbool, run:%RTbool, srst:%RTbool)",
     2209                       sdCtl,
     2210                       (sdCtl & HDA_REG_FIELD_MASK(SDCTL, NUM)) >> ICH6_HDA_SDCTL_NUM_SHIFT,
     2211                       RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, DIR)),
     2212                       RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, TP)),
     2213                       (sdCtl & HDA_REG_FIELD_MASK(SDCTL, STRIPE)) >> ICH6_HDA_SDCTL_STRIPE_SHIFT,
     2214                       RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, DEIE)),
     2215                       RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, ICE)),
     2216                       RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN)),
     2217                       RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, SRST)));
     2218}
     2219
     2220/**
     2221 * @callback_method_impl{FNRTSTRFORMATTYPE}
     2222 */
     2223static DECLCALLBACK(size_t)
     2224hdaFormatStrmFifos(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
     2225                   const char *pszType, void const *pvValue,
     2226                   int cchWidth, int cchPrecision, unsigned fFlags,
     2227                   void *pvUser)
     2228{
     2229    uint32_t uSdFifos = (uint32_t)(uintptr_t)pvValue;
     2230    uint32_t cb;
     2231    switch (uSdFifos)
     2232    {
     2233        case HDA_SDONFIFO_16B:  cb = 16; break;
     2234        case HDA_SDONFIFO_32B:  cb = 32; break;
     2235        case HDA_SDONFIFO_64B:  cb = 64; break;
     2236        case HDA_SDONFIFO_128B: cb = 128; break;
     2237        case HDA_SDONFIFO_192B: cb = 192; break;
     2238        case HDA_SDONFIFO_256B: cb = 256; break;
     2239        case HDA_SDINFIFO_120B: cb = 120; break;
     2240        case HDA_SDINFIFO_160B: cb = 160; break;
     2241        default:                cb = 0; break;
     2242    }
     2243    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "SDFIFOS(raw: %#x, sdfifos:%u B)", uSdFifos, cb);
     2244}
     2245
     2246/**
     2247 * @callback_method_impl{FNRTSTRFORMATTYPE}
     2248 */
     2249static DECLCALLBACK(size_t)
     2250hdaFormatStrmFifow(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
     2251                   const char *pszType, void const *pvValue,
     2252                   int cchWidth, int cchPrecision, unsigned fFlags,
     2253                   void *pvUser)
     2254{
     2255    uint32_t uSdFifos = (uint32_t)(uintptr_t)pvValue;
     2256    uint32_t cb;
     2257    switch (uSdFifos)
     2258    {
     2259        case HDA_SDFIFOW_8B:  cb = 8;  break;
     2260        case HDA_SDFIFOW_16B: cb = 16; break;
     2261        case HDA_SDFIFOW_32B: cb = 32; break;
     2262        default:              cb = 0;  break;
     2263    }
     2264    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0, "SDFIFOW(raw: %#0x, sdfifow:%d B)", uSdFifos, cb);
     2265}
     2266
     2267/**
     2268 * @callback_method_impl{FNRTSTRFORMATTYPE}
     2269 */
     2270static DECLCALLBACK(size_t)
     2271hdaFormatStrmSts(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
     2272                 const char *pszType, void const *pvValue,
     2273                 int cchWidth, int cchPrecision, unsigned fFlags,
     2274                 void *pvUser)
     2275{
     2276    uint32_t uSdSts = (uint32_t)(uintptr_t)pvValue;
     2277    return RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
     2278                       "SDSTS(raw: %#0x, fifordy:%RTbool, dese:%RTbool, fifoe:%RTbool, bcis:%RTbool)",
     2279                       uSdSts,
     2280                       RT_BOOL(uSdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY)),
     2281                       RT_BOOL(uSdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, DE)),
     2282                       RT_BOOL(uSdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, FE)),
     2283                       RT_BOOL(uSdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, BCIS)));
     2284}
     2285
     2286
     2287static int hdaLookUpRegisterByName(INTELHDLinkState *pState, const char *pszArgs)
     2288{
     2289    int iReg = 0;
     2290    for (; iReg < HDA_NREGS; ++iReg)
     2291        if (!RTStrICmp(g_aIchIntelHDRegMap[iReg].abbrev, pszArgs))
     2292            return iReg;
     2293    return -1;
     2294}
     2295
     2296
     2297static void hdaDbgPrintRegister(INTELHDLinkState *pState, PCDBGFINFOHLP pHlp, int iHdaIndex)
     2298{
     2299    Assert(   pState
     2300           && iHdaIndex >= 0
     2301           && iHdaIndex < HDA_NREGS);
     2302    pHlp->pfnPrintf(pHlp, "hda: %s: 0x%x\n", g_aIchIntelHDRegMap[iHdaIndex].abbrev, pState->au32Regs[iHdaIndex]);
     2303}
     2304
     2305
     2306/**
     2307 * @callback_method_impl{FNDBGFHANDLERDEV}
     2308 */
     2309static DECLCALLBACK(void) hdaInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
     2310{
     2311    PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
     2312    INTELHDLinkState *hda = &pThis->hda;
     2313    int iHdaRegisterIndex = hdaLookUpRegisterByName(hda, pszArgs);
     2314    if (iHdaRegisterIndex != -1)
     2315        hdaDbgPrintRegister(hda, pHlp, iHdaRegisterIndex);
     2316    else
     2317        for(iHdaRegisterIndex = 0; (unsigned int)iHdaRegisterIndex < HDA_NREGS; ++iHdaRegisterIndex)
     2318            hdaDbgPrintRegister(hda, pHlp, iHdaRegisterIndex);
     2319}
     2320
     2321
     2322static void hdaDbgPrintStream(INTELHDLinkState *pState, PCDBGFINFOHLP pHlp, int iHdaStrmIndex)
     2323{
     2324    Assert(   pState
     2325           && iHdaStrmIndex >= 0
     2326           && iHdaStrmIndex < 7);
     2327    pHlp->pfnPrintf(pHlp, "Dump of %d HDA Stream:\n", iHdaStrmIndex);
     2328    pHlp->pfnPrintf(pHlp, "SD%dCTL: %R[sdctl]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, CTL, iHdaStrmIndex));
     2329    pHlp->pfnPrintf(pHlp, "SD%dCTS: %R[sdsts]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, STS, iHdaStrmIndex));
     2330    pHlp->pfnPrintf(pHlp, "SD%dFIFOS: %R[sdfifos]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, FIFOS, iHdaStrmIndex));
     2331    pHlp->pfnPrintf(pHlp, "SD%dFIFOW: %R[sdfifow]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, FIFOW, iHdaStrmIndex));
     2332}
     2333
     2334
     2335static int hdaLookUpStreamIndex(INTELHDLinkState *pState, const char *pszArgs)
     2336{
     2337    /* todo: add args parsing */
     2338    return -1;
     2339}
     2340
     2341
     2342/**
     2343 * @callback_method_impl{FNDBGFHANDLERDEV}
     2344 */
     2345static DECLCALLBACK(void) hdaInfoStream(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
     2346{
     2347    PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
     2348    INTELHDLinkState *hda = &pThis->hda;
     2349    int iHdaStrmIndex = hdaLookUpStreamIndex(hda, pszArgs);
     2350    if (iHdaStrmIndex != -1)
     2351        hdaDbgPrintStream(hda, pHlp, iHdaStrmIndex);
     2352    else
     2353        for(iHdaStrmIndex = 0; iHdaStrmIndex < 7; ++iHdaStrmIndex)
     2354            hdaDbgPrintStream(hda, pHlp, iHdaStrmIndex);
     2355}
     2356
     2357/**
     2358 * @callback_method_impl{FNDBGFHANDLERDEV}
     2359 */
     2360static DECLCALLBACK(void) hdaInfoCodecNodes(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
     2361{
     2362    PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
     2363    INTELHDLinkState *hda = &pThis->hda;
     2364    if (hda->Codec.pfnCodecDbgListNodes)
     2365        hda->Codec.pfnCodecDbgListNodes(&hda->Codec, pHlp, pszArgs);
     2366    else
     2367        pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
     2368}
     2369
     2370
     2371/**
     2372 * @callback_method_impl{FNDBGFHANDLERDEV}
     2373 */
     2374static DECLCALLBACK(void) hdaInfoCodecSelector(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
     2375{
     2376    PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
     2377    INTELHDLinkState *hda = &pThis->hda;
     2378    if (hda->Codec.pfnCodecDbgSelector)
     2379        hda->Codec.pfnCodecDbgSelector(&hda->Codec, pHlp, pszArgs);
     2380    else
     2381        pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
     2382}
     2383
     2384
     2385/* PDMIBASE */
     2386
     2387/**
     2388 * @interface_method_impl{PDMIBASE,pfnQueryInterface}
     2389 */
     2390static DECLCALLBACK(void *) hdaQueryInterface(struct PDMIBASE *pInterface, const char *pszIID)
     2391{
     2392    PCIINTELHDLinkState *pThis = RT_FROM_MEMBER(pInterface, PCIINTELHDLinkState, hda.IBase);
     2393    Assert(&pThis->hda.IBase == pInterface);
     2394
     2395    PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThis->hda.IBase);
     2396    return NULL;
     2397}
     2398
     2399
     2400/* PDMDEVREG */
     2401
    21982402/**
    21992403 * Reset notification.
     
    22362440
    22372441    HDABDLEDESC stEmptyBdle;
    2238     for(uint8_t u8Strm = 0; u8Strm < 8; ++u8Strm)
    2239     {
    2240         HDASTREAMTRANSFERDESC stStreamDesc;
     2442    for (uint8_t u8Strm = 0; u8Strm < 8; ++u8Strm)
     2443    {
     2444        HDASTREAMTRANSFERDESC StreamDesc;
    22412445        PHDABDLEDESC pBdle = NULL;
    22422446        if (u8Strm == 0)
     
    22492453            pBdle = &stEmptyBdle;
    22502454        }
    2251         hdaInitTransferDescriptor(&pThis->hda, pBdle, u8Strm, &stStreamDesc);
     2455        hdaInitTransferDescriptor(&pThis->hda, pBdle, u8Strm, &StreamDesc);
    22522456        /* hdaStreamReset prevents changing the SRST bit, so we force it to zero here. */
    22532457        HDA_STREAM_REG2(&pThis->hda, CTL, u8Strm) = 0;
    2254         hdaStreamReset(&pThis->hda, pBdle, &stStreamDesc, u8Strm);
     2458        hdaStreamReset(&pThis->hda, pBdle, &StreamDesc, u8Strm);
    22552459    }
    22562460
     
    22612465}
    22622466
     2467
    22632468/**
    2264  * @interface_method_impl{PDMIBASE,pfnQueryInterface}
     2469 * @interface_method_impl{PDMDEVREG,pfnDestruct}
    22652470 */
    2266 static DECLCALLBACK(void *) hdaQueryInterface (struct PDMIBASE *pInterface,
    2267                                                    const char *pszIID)
    2268 {
    2269     PCIINTELHDLinkState *pThis = RT_FROM_MEMBER(pInterface, PCIINTELHDLinkState, hda.IBase);
    2270     Assert(&pThis->hda.IBase == pInterface);
    2271 
    2272     PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBASE, &pThis->hda.IBase);
    2273     return NULL;
    2274 }
    2275 
    2276 DECLINLINE(int) hdaLookUpRegisterByName(INTELHDLinkState *pState, const char *pszArgs)
    2277 {
    2278     int iReg = 0;
    2279     for (; iReg < HDA_NREGS; ++iReg)
    2280         if (!RTStrICmp(s_ichIntelHDRegMap[iReg].abbrev, pszArgs))
    2281             return iReg;
    2282     return -1;
    2283 }
    2284 DECLINLINE(void) hdaDbgPrintRegister(INTELHDLinkState *pState, PCDBGFINFOHLP pHlp, int iHdaIndex)
    2285 {
    2286     Assert(   pState
    2287            && iHdaIndex >= 0
    2288            && iHdaIndex < HDA_NREGS);
    2289     pHlp->pfnPrintf(pHlp, "hda: %s: 0x%x\n", s_ichIntelHDRegMap[iHdaIndex].abbrev, pState->au32Regs[iHdaIndex]);
    2290 }
    2291 static DECLCALLBACK(void) hdaDbgInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
     2471static DECLCALLBACK(int) hdaDestruct(PPDMDEVINS pDevIns)
    22922472{
    22932473    PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
    2294     INTELHDLinkState *hda = &pThis->hda;
    2295     int iHdaRegisterIndex = hdaLookUpRegisterByName(hda, pszArgs);
    2296     if (iHdaRegisterIndex != -1)
    2297         hdaDbgPrintRegister(hda, pHlp, iHdaRegisterIndex);
    2298     else
    2299         for(iHdaRegisterIndex = 0; (unsigned int)iHdaRegisterIndex < HDA_NREGS; ++iHdaRegisterIndex)
    2300             hdaDbgPrintRegister(hda, pHlp, iHdaRegisterIndex);
    2301 }
    2302 
    2303 DECLINLINE(void) hdaDbgPrintStream(INTELHDLinkState *pState, PCDBGFINFOHLP pHlp, int iHdaStrmIndex)
    2304 {
    2305     Assert(   pState
    2306            && iHdaStrmIndex >= 0
    2307            && iHdaStrmIndex < 7);
    2308     pHlp->pfnPrintf(pHlp, "Dump of %d HDA Stream:\n", iHdaStrmIndex);
    2309     pHlp->pfnPrintf(pHlp, "SD%dCTL: %R[sdctl]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, CTL, iHdaStrmIndex));
    2310     pHlp->pfnPrintf(pHlp, "SD%dCTS: %R[sdsts]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, STS, iHdaStrmIndex));
    2311     pHlp->pfnPrintf(pHlp, "SD%dFIFOS: %R[sdfifos]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, FIFOS, iHdaStrmIndex));
    2312     pHlp->pfnPrintf(pHlp, "SD%dFIFOW: %R[sdfifow]\n", iHdaStrmIndex, HDA_STREAM_REG2(pState, FIFOW, iHdaStrmIndex));
    2313 }
    2314 
    2315 DECLINLINE(int) hdaLookUpStreamIndex(INTELHDLinkState *pState, const char *pszArgs)
    2316 {
    2317     /* todo: add args parsing */
    2318     return -1;
    2319 }
    2320 static DECLCALLBACK(void) hdaDbgStreamInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
    2321 {
    2322     PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
    2323     INTELHDLinkState *hda = &pThis->hda;
    2324     int iHdaStrmIndex = hdaLookUpStreamIndex(hda, pszArgs);
    2325     if (iHdaStrmIndex != -1)
    2326         hdaDbgPrintStream(hda, pHlp, iHdaStrmIndex);
    2327     else
    2328         for(iHdaStrmIndex = 0; iHdaStrmIndex < 7; ++iHdaStrmIndex)
    2329             hdaDbgPrintStream(hda, pHlp, iHdaStrmIndex);
    2330 }
    2331 
    2332 /* Codec debugger interface */
    2333 static DECLCALLBACK(void) hdaCodecDbgNodes(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
    2334 {
    2335     PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
    2336     INTELHDLinkState *hda = &pThis->hda;
    2337     if (hda->Codec.pfnCodecDbgListNodes)
    2338         hda->Codec.pfnCodecDbgListNodes(&hda->Codec, pHlp, pszArgs);
    2339     else
    2340         pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
    2341 }
    2342 
    2343 static DECLCALLBACK(void) hdaCodecDbgSelector(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
    2344 {
    2345     PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
    2346     INTELHDLinkState *hda = &pThis->hda;
    2347     if (hda->Codec.pfnCodecDbgSelector)
    2348         hda->Codec.pfnCodecDbgSelector(&hda->Codec, pHlp, pszArgs);
    2349     else
    2350         pHlp->pfnPrintf(pHlp, "Codec implementation doesn't provide corresponding callback.\n");
    2351 }
    2352 
    2353 //#define HDA_AS_PCI_EXPRESS
    2354 /* Misc routines */
    2355 static inline bool printHdaIsValid(const char *pszType, const char *pszExpectedFlag)
    2356 {
    2357     return (RTStrCmp(pszType, pszExpectedFlag) == 0);
    2358 }
    2359 static const char *printHdaYesNo(bool fFlag)
    2360 {
    2361     return fFlag ? "yes" : "no";
    2362 }
    2363 static DECLCALLBACK(size_t)
    2364 printHdaStrmCtl(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
    2365                  const char *pszType, void const *pvValue,
    2366                  int cchWidth, int cchPrecision, unsigned fFlags,
    2367                  void *pvUser)
    2368 {
    2369     uint32_t sdCtl = (uint32_t)(uintptr_t)pvValue;
    2370     size_t cb = 0;
    2371     if (!printHdaIsValid(pszType, "sdctl"))
    2372         return cb;
    2373     cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
    2374                       "SDCTL(raw: %#0x, strm:0x%x, dir:%s, tp:%s strip:%x, deie:%s, ioce:%s, run:%s, srst:%s)",
    2375                       sdCtl,
    2376                       ((sdCtl & HDA_REG_FIELD_MASK(SDCTL, NUM)) >> ICH6_HDA_SDCTL_NUM_SHIFT),
    2377                       printHdaYesNo(RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, DIR))),
    2378                       printHdaYesNo(RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, TP))),
    2379                       ((sdCtl & HDA_REG_FIELD_MASK(SDCTL, STRIPE)) >> ICH6_HDA_SDCTL_STRIPE_SHIFT),
    2380                       printHdaYesNo(RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, DEIE))),
    2381                       printHdaYesNo(RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, ICE))),
    2382                       printHdaYesNo(RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, RUN))),
    2383                       printHdaYesNo(RT_BOOL(sdCtl & HDA_REG_FIELD_FLAG_MASK(SDCTL, SRST))));
    2384     return cb;
    2385 }
    2386 
    2387 static DECLCALLBACK(size_t)
    2388 printHdaStrmFifos(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
    2389                  const char *pszType, void const *pvValue,
    2390                  int cchWidth, int cchPrecision, unsigned fFlags,
    2391                  void *pvUser)
    2392 {
    2393     uint32_t sdFifos = (uint32_t)(uintptr_t)pvValue;
    2394     uint32_t u32Bytes = 0;
    2395     size_t cb = 0;
    2396     if (!printHdaIsValid(pszType, "sdfifos"))
    2397         return cb;
    2398     switch(sdFifos)
    2399     {
    2400         case HDA_SDONFIFO_16B: u32Bytes = 16; break;
    2401         case HDA_SDONFIFO_32B: u32Bytes = 32; break;
    2402         case HDA_SDONFIFO_64B: u32Bytes = 64; break;
    2403         case HDA_SDONFIFO_128B: u32Bytes = 128; break;
    2404         case HDA_SDONFIFO_192B: u32Bytes = 192; break;
    2405         case HDA_SDONFIFO_256B: u32Bytes = 256; break;
    2406         case HDA_SDINFIFO_120B: u32Bytes = 120; break;
    2407         case HDA_SDINFIFO_160B: u32Bytes = 160; break;
    2408         default:;
    2409     }
    2410     cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
    2411                       "SDFIFOS(raw: %#0x, sdfifos:%d B)",
    2412                       sdFifos,
    2413                       u32Bytes);
    2414     return cb;
    2415 }
    2416 
    2417 static DECLCALLBACK(size_t)
    2418 printHdaStrmFifow(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
    2419                  const char *pszType, void const *pvValue,
    2420                  int cchWidth, int cchPrecision, unsigned fFlags,
    2421                  void *pvUser)
    2422 {
    2423     uint32_t sdFifow = (uint32_t)(uintptr_t)pvValue;
    2424     uint32_t u32Bytes = 0;
    2425     size_t cb = 0;
    2426     if (!printHdaIsValid(pszType, "sdfifow"))
    2427         return cb;
    2428     switch(sdFifow)
    2429     {
    2430         case HDA_SDFIFOW_8B: u32Bytes = 8; break;
    2431         case HDA_SDFIFOW_16B: u32Bytes = 16; break;
    2432         case HDA_SDFIFOW_32B: u32Bytes = 32; break;
    2433     }
    2434     cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
    2435                       "SDFIFOW(raw: %#0x, sdfifow:%d B)",
    2436                       sdFifow,
    2437                       u32Bytes);
    2438     return cb;
    2439 }
    2440 
    2441 static DECLCALLBACK(size_t)
    2442 printHdaStrmSts(PFNRTSTROUTPUT pfnOutput, void *pvArgOutput,
    2443                  const char *pszType, void const *pvValue,
    2444                  int cchWidth, int cchPrecision, unsigned fFlags,
    2445                  void *pvUser)
    2446 {
    2447     uint32_t sdSts = (uint32_t)(uintptr_t)pvValue;
    2448     size_t cb = 0;
    2449     if (!printHdaIsValid(pszType, "sdsts"))
    2450         return cb;
    2451     cb += RTStrFormat(pfnOutput, pvArgOutput, NULL, 0,
    2452                       "SDSTS(raw: %#0x, fifordy:%s, dese:%s, fifoe:%s, bcis:%s)",
    2453                       sdSts,
    2454                       printHdaYesNo(RT_BOOL(sdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, FIFORDY))),
    2455                       printHdaYesNo(RT_BOOL(sdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, DE))),
    2456                       printHdaYesNo(RT_BOOL(sdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, FE))),
    2457                       printHdaYesNo(RT_BOOL(sdSts & HDA_REG_FIELD_FLAG_MASK(SDSTS, BCIS))));
    2458     return cb;
    2459 }
    2460 /**
    2461  * This routine registers debugger info extensions and custom printf formatters
    2462  */
    2463 DECLINLINE(int) hdaInitMisc(PPDMDEVINS pDevIns)
    2464 {
    2465     int rc;
    2466     PDMDevHlpDBGFInfoRegister(pDevIns, "hda", "HDA info. (hda [register case-insensitive])", hdaDbgInfo);
    2467     PDMDevHlpDBGFInfoRegister(pDevIns, "hdastrm", "HDA stream info. (hdastrm [stream number])", hdaDbgStreamInfo);
    2468     PDMDevHlpDBGFInfoRegister(pDevIns, "hdcnodes", "HDA codec nodes.", hdaCodecDbgNodes);
    2469     PDMDevHlpDBGFInfoRegister(pDevIns, "hdcselector", "HDA codec's selector states [node number].", hdaCodecDbgSelector);
    2470     rc = RTStrFormatTypeRegister("sdctl", printHdaStrmCtl, NULL);
     2474
     2475    int rc = codecDestruct(&pThis->hda.Codec);
    24712476    AssertRC(rc);
    2472     rc = RTStrFormatTypeRegister("sdsts", printHdaStrmSts, NULL);
    2473     AssertRC(rc);
    2474     rc = RTStrFormatTypeRegister("sdfifos", printHdaStrmFifos, NULL);
    2475     AssertRC(rc);
    2476     rc = RTStrFormatTypeRegister("sdfifow", printHdaStrmFifow, NULL);
    2477     AssertRC(rc);
    2478 #if 0
    2479     rc = RTStrFormatTypeRegister("sdfmt", printHdaStrmFmt, NULL);
    2480     AssertRC(rc);
    2481 #endif
    2482     return rc;
     2477    if (pThis->hda.pu32CorbBuf)
     2478        RTMemFree(pThis->hda.pu32CorbBuf);
     2479    if (pThis->hda.pu64RirbBuf)
     2480        RTMemFree(pThis->hda.pu64RirbBuf);
     2481    return VINF_SUCCESS;
    24832482}
    24842483
     
    24992498     * Validations.
    25002499     */
    2501     if (!CFGMR3AreValuesValid (pCfgHandle, "\0"))
    2502         return PDMDEV_SET_ERROR (pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    2503                                  N_ ("Invalid configuration for the Intel HDA device"));
     2500    if (!CFGMR3AreValuesValid(pCfgHandle, "\0"))
     2501        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     2502                                N_ ("Invalid configuration for the Intel HDA device"));
    25042503
    25052504    // ** @todo r=michaln: This device may need R0/RC enabling, especially if guests
     
    25382537
    25392538    /// @todo r=michaln: If there are really no PCIDevSetXx for these, the meaning
    2540     // of these values needs to be properly documented!
     2539    /// of these values needs to be properly documented!
    25412540    /* HDCTL off 0x40 bit 0 selects signaling mode (1-HDA, 0 - Ac97) 18.1.19 */
    25422541    PCIDevSetByte(&pThis->dev, 0x40, 0x01);
     
    25492548#ifdef HDA_AS_PCI_EXPRESS
    25502549    /* PCI Express */
    2551     PCIDevSetByte  (&pThis->dev, 0x80 + 0, VBOX_PCI_CAP_ID_EXP); /* PCI_Express */
    2552     PCIDevSetByte  (&pThis->dev, 0x80 + 1, 0x60); /* next */
     2550    PCIDevSetByte(&pThis->dev, 0x80 + 0, VBOX_PCI_CAP_ID_EXP); /* PCI_Express */
     2551    PCIDevSetByte(&pThis->dev, 0x80 + 1, 0x60); /* next */
    25532552    /* Device flags */
    2554     PCIDevSetWord  (&pThis->dev, 0x80 + 2,
    2555                     /* version */ 0x1     |
    2556                     /* Root Complex Integrated Endpoint */ (VBOX_PCI_EXP_TYPE_ROOT_INT_EP << 4) |
    2557                     /* MSI */ (100) << 9
    2558                     );
     2553    PCIDevSetWord(&pThis->dev, 0x80 + 2,
     2554                   /* version */ 0x1     |
     2555                   /* Root Complex Integrated Endpoint */ (VBOX_PCI_EXP_TYPE_ROOT_INT_EP << 4) |
     2556                   /* MSI */ (100) << 9 );
    25592557    /* Device capabilities */
    2560     PCIDevSetDWord (&pThis->dev, 0x80 + 4, VBOX_PCI_EXP_DEVCAP_FLRESET);
     2558    PCIDevSetDWord(&pThis->dev, 0x80 + 4, VBOX_PCI_EXP_DEVCAP_FLRESET);
    25612559    /* Device control */
    2562     PCIDevSetWord  (&pThis->dev, 0x80 + 8, 0);
     2560    PCIDevSetWord( &pThis->dev, 0x80 + 8, 0);
    25632561    /* Device status */
    2564     PCIDevSetWord  (&pThis->dev, 0x80 + 10, 0);
     2562    PCIDevSetWord( &pThis->dev, 0x80 + 10, 0);
    25652563    /* Link caps */
    2566     PCIDevSetDWord (&pThis->dev, 0x80 + 12, 0);
     2564    PCIDevSetDWord(&pThis->dev, 0x80 + 12, 0);
    25672565    /* Link control */
    2568     PCIDevSetWord  (&pThis->dev, 0x80 + 16, 0);
     2566    PCIDevSetWord( &pThis->dev, 0x80 + 16, 0);
    25692567    /* Link status */
    2570     PCIDevSetWord  (&pThis->dev, 0x80 + 18, 0);
     2568    PCIDevSetWord( &pThis->dev, 0x80 + 18, 0);
    25712569    /* Slot capabilities */
    2572     PCIDevSetDWord (&pThis->dev, 0x80 + 20, 0);
     2570    PCIDevSetDWord(&pThis->dev, 0x80 + 20, 0);
    25732571    /* Slot control */
    2574     PCIDevSetWord  (&pThis->dev, 0x80 + 24, 0);
     2572    PCIDevSetWord( &pThis->dev, 0x80 + 24, 0);
    25752573    /* Slot status */
    2576     PCIDevSetWord  (&pThis->dev, 0x80 + 26, 0);
     2574    PCIDevSetWord( &pThis->dev, 0x80 + 26, 0);
    25772575    /* Root control */
    2578     PCIDevSetWord  (&pThis->dev, 0x80 + 28, 0);
     2576    PCIDevSetWord( &pThis->dev, 0x80 + 28, 0);
    25792577    /* Root capabilities */
    2580     PCIDevSetWord  (&pThis->dev, 0x80 + 30, 0);
     2578    PCIDevSetWord( &pThis->dev, 0x80 + 30, 0);
    25812579    /* Root status */
    2582     PCIDevSetDWord (&pThis->dev, 0x80 + 32, 0);
     2580    PCIDevSetDWord(&pThis->dev, 0x80 + 32, 0);
    25832581    /* Device capabilities 2 */
    2584     PCIDevSetDWord (&pThis->dev, 0x80 + 36, 0);
     2582    PCIDevSetDWord(&pThis->dev, 0x80 + 36, 0);
    25852583    /* Device control 2 */
    2586     PCIDevSetQWord (&pThis->dev, 0x80 + 40, 0);
     2584    PCIDevSetQWord(&pThis->dev, 0x80 + 40, 0);
    25872585    /* Link control 2 */
    2588     PCIDevSetQWord (&pThis->dev, 0x80 + 48, 0);
     2586    PCIDevSetQWord(&pThis->dev, 0x80 + 48, 0);
    25892587    /* Slot control 2 */
    2590     PCIDevSetWord  (&pThis->dev, 0x80 + 56, 0);
     2588    PCIDevSetWord( &pThis->dev, 0x80 + 56, 0);
    25912589#endif
    25922590
     
    25942592     * Register the PCI device.
    25952593     */
    2596     rc = PDMDevHlpPCIRegister (pDevIns, &pThis->dev);
    2597     if (RT_FAILURE (rc))
     2594    rc = PDMDevHlpPCIRegister(pDevIns, &pThis->dev);
     2595    if (RT_FAILURE(rc))
    25982596        return rc;
    25992597
    2600     rc = PDMDevHlpPCIIORegionRegister (pDevIns, 0, 0x4000, PCI_ADDRESS_SPACE_MEM,
    2601                                        hdaMap);
    2602     if (RT_FAILURE (rc))
     2598    rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0, 0x4000, PCI_ADDRESS_SPACE_MEM, hdaMap);
     2599    if (RT_FAILURE(rc))
    26032600        return rc;
    26042601
     
    26102607    MsiReg.iMsiNextOffset = 0x50;
    26112608    rc = PDMDevHlpPCIRegisterMsi(pDevIns, &MsiReg);
    2612     if (RT_FAILURE (rc))
     2609    if (RT_FAILURE(rc))
    26132610    {
    26142611        LogRel(("Chipset cannot do MSI: %Rrc\n", rc));
    2615         PCIDevSetCapabilityList     (&pThis->dev, 0x50);
     2612        PCIDevSetCapabilityList(&pThis->dev, 0x50);
    26162613    }
    26172614#endif
    26182615
    2619     rc = PDMDevHlpSSMRegister (pDevIns, HDA_SSM_VERSION, sizeof(*pThis), hdaSaveExec, hdaLoadExec);
    2620     if (RT_FAILURE (rc))
     2616    rc = PDMDevHlpSSMRegister(pDevIns, HDA_SSM_VERSION, sizeof(*pThis), hdaSaveExec, hdaLoadExec);
     2617    if (RT_FAILURE(rc))
    26212618        return rc;
    26222619
     
    26242621     * Attach driver.
    26252622     */
    2626     rc = PDMDevHlpDriverAttach (pDevIns, 0, &s->IBase,
    2627                                 &s->pDrvBase, "Audio Driver Port");
     2623    rc = PDMDevHlpDriverAttach(pDevIns, 0, &s->IBase, &s->pDrvBase, "Audio Driver Port");
    26282624    if (rc == VERR_PDM_NO_ATTACHED_DRIVER)
    2629         Log (("hda: No attached driver!\n"));
    2630     else if (RT_FAILURE (rc))
    2631     {
    2632         AssertMsgFailed (("Failed to attach Intel HDA LUN #0! rc=%Rrc\n", rc));
     2625        Log(("hda: No attached driver!\n"));
     2626    else if (RT_FAILURE(rc))
     2627    {
     2628        AssertMsgFailed(("Failed to attach Intel HDA LUN #0! rc=%Rrc\n", rc));
    26332629        return rc;
    26342630    }
     
    26362632
    26372633
    2638     pThis->hda.Codec.pHDAState = (void *)&pThis->hda;
     2634    pThis->hda.Codec.pvHDAState = (void *)&pThis->hda;
    26392635    rc = codecConstruct(pDevIns, &pThis->hda.Codec, pCfgHandle);
    26402636    if (RT_FAILURE(rc))
     
    26482644    PCIDevSetSubSystemId        (&pThis->dev, pThis->hda.Codec.u16DeviceId); /* 2e ro. */
    26492645
    2650     hdaReset (pDevIns);
     2646    hdaReset(pDevIns);
    26512647    pThis->hda.Codec.id = 0;
    26522648    pThis->hda.Codec.pfnTransfer = hdaTransfer;
    26532649    pThis->hda.Codec.pfnReset = hdaCodecReset;
     2650
    26542651    /*
    26552652     * 18.2.6,7 defines that values of this registers might be cleared on power on/reset
     
    26582655    WAKEEN(&pThis->hda) = 0x0;
    26592656    STATESTS(&pThis->hda) = 0x0;
    2660     hdaInitMisc(pDevIns);
    2661 
    2662     return VINF_SUCCESS;
    2663 }
    2664 
    2665 /**
    2666  * @interface_method_impl{PDMDEVREG,pfnDestruct}
    2667  */
    2668 static DECLCALLBACK(int) hdaDestruct (PPDMDEVINS pDevIns)
    2669 {
    2670     PCIINTELHDLinkState *pThis = PDMINS_2_DATA(pDevIns, PCIINTELHDLinkState *);
    2671 
    2672     int rc = codecDestruct(&pThis->hda.Codec);
     2657
     2658    /*
     2659     * Debug and string formatter types.
     2660     */
     2661    PDMDevHlpDBGFInfoRegister(pDevIns, "hda",         "HDA info. (hda [register case-insensitive])",    hdaInfo);
     2662    PDMDevHlpDBGFInfoRegister(pDevIns, "hdastrm",     "HDA stream info. (hdastrm [stream number])",     hdaInfoStream);
     2663    PDMDevHlpDBGFInfoRegister(pDevIns, "hdcnodes",    "HDA codec nodes.",                               hdaInfoCodecNodes);
     2664    PDMDevHlpDBGFInfoRegister(pDevIns, "hdcselector", "HDA codec's selector states [node number].",     hdaInfoCodecSelector);
     2665
     2666    rc = RTStrFormatTypeRegister("sdctl",   hdaFormatStrmCtl,   NULL);
    26732667    AssertRC(rc);
    2674     if (pThis->hda.pu32CorbBuf)
    2675         RTMemFree(pThis->hda.pu32CorbBuf);
    2676     if (pThis->hda.pu64RirbBuf)
    2677         RTMemFree(pThis->hda.pu64RirbBuf);
     2668    rc = RTStrFormatTypeRegister("sdsts",   hdaFormatStrmSts,   NULL);
     2669    AssertRC(rc);
     2670    rc = RTStrFormatTypeRegister("sdfifos", hdaFormatStrmFifos, NULL);
     2671    AssertRC(rc);
     2672    rc = RTStrFormatTypeRegister("sdfifow", hdaFormatStrmFifow, NULL);
     2673    AssertRC(rc);
     2674#if 0
     2675    rc = RTStrFormatTypeRegister("sdfmt", printHdaStrmFmt, NULL);
     2676    AssertRC(rc);
     2677#endif
     2678
    26782679    return VINF_SUCCESS;
    26792680}
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