VirtualBox

Changeset 82293 in vbox


Ignore:
Timestamp:
Nov 29, 2019 10:22:31 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
135117
Message:

DevIchAc97: Converted I/O ports. bugref:9218

File:
1 edited

Legend:

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

    r82255 r82293  
    513513    /** The timer for pumping data thru the attached LUN drivers - R0Ptr. */
    514514    PTMTIMERR0              pTimerR0[AC97_MAX_STREAMS];
    515 #ifdef VBOX_WITH_STATISTICS
    516     STAMPROFILE             StatTimer;
    517     STAMPROFILE             StatIn;
    518     STAMPROFILE             StatOut;
    519     STAMCOUNTER             StatBytesRead;
    520     STAMCOUNTER             StatBytesWritten;
    521 #endif
    522515    /** List of associated LUN drivers (AC97DRIVER). */
    523516    RTLISTANCHORR3          lstDrv;
     
    532525    uint8_t                 silence[128];
    533526    int32_t                 bup_flag;
    534     /** Base port of the I/O space region. */
    535     RTIOPORT                IOPortBase[2];
    536527    /** Codec model. */
    537528    uint32_t                uCodecModel;
    538 #if HC_ARCH_BITS == 64
    539     uint32_t                uPadding2;
    540 #endif
    541529    /** The base interface for LUN\#0. */
    542530    PDMIBASE                IBase;
    543531    AC97STATEDBGINFO        Dbg;
     532
     533    /** PCI region \#0: NAM I/O ports. */
     534    IOMIOPORTHANDLE         hIoPortsNam;
     535    /** PCI region \#0: NANM I/O ports. */
     536    IOMIOPORTHANDLE         hIoPortsNabm;
     537
     538#ifdef VBOX_WITH_STATISTICS
     539    STAMPROFILE             StatTimer;
     540    STAMPROFILE             StatIn;
     541    STAMPROFILE             StatOut;
     542    STAMCOUNTER             StatBytesRead;
     543    STAMCOUNTER             StatBytesWritten;
     544#endif
    544545} AC97STATE;
    545546AssertCompileMemberAlignment(AC97STATE, aStreams, 8);
     
    22582259    }
    22592260
    2260     const bool    fCtlMuted    = (uVal >> AC97_BARS_VOL_MUTE_SHIFT) & 1;
    2261           uint8_t uCtlAttLeft  = (uVal >> 8) & AC97_BARS_VOL_MASK;
    2262           uint8_t uCtlAttRight = uVal & AC97_BARS_VOL_MASK;
     2261    const bool  fCtlMuted    = (uVal >> AC97_BARS_VOL_MUTE_SHIFT) & 1;
     2262    uint8_t    uCtlAttLeft  = (uVal >> 8) & AC97_BARS_VOL_MASK;
     2263    uint8_t    uCtlAttRight = uVal & AC97_BARS_VOL_MASK;
    22632264
    22642265    /* For the master and headphone volume, 0 corresponds to 0dB attenuation. For the other
     
    23462347     * zero being 0dB gain and 15 being +22.5dB gain.
    23472348     */
    2348     const bool    fCtlMuted     = (uVal >> AC97_BARS_VOL_MUTE_SHIFT) & 1;
    2349           uint8_t uCtlGainLeft  = (uVal >> 8) & AC97_BARS_GAIN_MASK;
    2350           uint8_t uCtlGainRight = uVal & AC97_BARS_GAIN_MASK;
     2349    const bool  fCtlMuted     = (uVal >> AC97_BARS_VOL_MUTE_SHIFT) & 1;
     2350    uint8_t    uCtlGainLeft  = (uVal >> 8) & AC97_BARS_GAIN_MASK;
     2351    uint8_t    uCtlGainRight = uVal & AC97_BARS_GAIN_MASK;
    23512352
    23522353    Assert(uCtlGainLeft  <= 255 / AC97_DB_FACTOR);
     
    29332934
    29342935/**
    2935  * Port I/O Handler for IN operations.
    2936  *
    2937  * @returns VINF_SUCCESS or VINF_EM_*.
    2938  * @returns VERR_IOM_IOPORT_UNUSED if the port is really unused and a ~0 value should be returned.
    2939  *
    2940  * @param   pDevIns     The device instance.
    2941  * @param   pvUser      User argument.
    2942  * @param   uPort       Port number used for the IN operation.
    2943  * @param   pu32Val     Where to store the result.  This is always a 32-bit
    2944  *                      variable regardless of what @a cbVal might say.
    2945  * @param   cbVal       Number of bytes read.
    2946  */
    2947 PDMBOTHCBDECL(int) ichac97IOPortNABMRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t *pu32Val, unsigned cbVal)
     2936 * @callback_method_impl{FNIOMIOPORTNEWOUT}
     2937 */
     2938static DECLCALLBACK(VBOXSTRICTRC)
     2939ichac97IoPortNabmRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)
    29482940{
    29492941    PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
     
    29532945
    29542946    /* Get the index of the NABMBAR port. */
    2955     const uint32_t uPortIdx = uPort - pThis->IOPortBase[1];
    2956 
    29572947    PAC97STREAM pStream = NULL;
    29582948    PAC97BMREGS pRegs   = NULL;
    2959 
    2960     if (AC97_PORT2IDX(uPortIdx) < AC97_MAX_STREAMS)
    2961     {
    2962         pStream = &pThis->aStreams[AC97_PORT2IDX(uPortIdx)];
     2949    if (AC97_PORT2IDX(offPort) < AC97_MAX_STREAMS)
     2950    {
     2951        pStream = &pThis->aStreams[AC97_PORT2IDX(offPort)];
    29632952        AssertPtr(pStream);
    29642953        pRegs   = &pStream->Regs;
    29652954    }
    29662955
    2967     int rc = VINF_SUCCESS;
    2968 
    2969     switch (cbVal)
     2956    VBOXSTRICTRC rc = VINF_SUCCESS;
     2957
     2958    switch (cb)
    29702959    {
    29712960        case 1:
    29722961        {
    2973             switch (uPortIdx)
     2962            switch (offPort)
    29742963            {
    29752964                case AC97_CAS:
    29762965                    /* Codec Access Semaphore Register */
    29772966                    Log3Func(("CAS %d\n", pThis->cas));
    2978                     *pu32Val = pThis->cas;
     2967                    *pu32 = pThis->cas;
    29792968                    pThis->cas = 1;
    29802969                    break;
     
    29832972                case MC_CIV:
    29842973                    /* Current Index Value Register */
    2985                     *pu32Val = pRegs->civ;
    2986                     Log3Func(("CIV[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     2974                    *pu32 = pRegs->civ;
     2975                    Log3Func(("CIV[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    29872976                    break;
    29882977                case PI_LVI:
     
    29902979                case MC_LVI:
    29912980                    /* Last Valid Index Register */
    2992                     *pu32Val = pRegs->lvi;
    2993                     Log3Func(("LVI[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     2981                    *pu32 = pRegs->lvi;
     2982                    Log3Func(("LVI[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    29942983                    break;
    29952984                case PI_PIV:
     
    29972986                case MC_PIV:
    29982987                    /* Prefetched Index Value Register */
    2999                     *pu32Val = pRegs->piv;
    3000                     Log3Func(("PIV[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     2988                    *pu32 = pRegs->piv;
     2989                    Log3Func(("PIV[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    30012990                    break;
    30022991                case PI_CR:
     
    30042993                case MC_CR:
    30052994                    /* Control Register */
    3006                     *pu32Val = pRegs->cr;
    3007                     Log3Func(("CR[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     2995                    *pu32 = pRegs->cr;
     2996                    Log3Func(("CR[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    30082997                    break;
    30092998                case PI_SR:
     
    30113000                case MC_SR:
    30123001                    /* Status Register (lower part) */
    3013                     *pu32Val = RT_LO_U8(pRegs->sr);
    3014                     Log3Func(("SRb[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     3002                    *pu32 = RT_LO_U8(pRegs->sr);
     3003                    Log3Func(("SRb[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    30153004                    break;
    30163005                default:
    3017                     *pu32Val = UINT32_MAX;
    3018                     LogFunc(("U nabm readb %#x -> %#x\n", uPort, *pu32Val));
     3006                    *pu32 = UINT32_MAX;
     3007                    LogFunc(("U nabm readb %#x -> %#x\n", offPort, UINT32_MAX));
    30193008                    break;
    30203009            }
     
    30243013        case 2:
    30253014        {
    3026             switch (uPortIdx)
     3015            switch (offPort)
    30273016            {
    30283017                case PI_SR:
     
    30303019                case MC_SR:
    30313020                    /* Status Register */
    3032                     *pu32Val = pRegs->sr;
    3033                     Log3Func(("SR[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     3021                    *pu32 = pRegs->sr;
     3022                    Log3Func(("SR[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    30343023                    break;
    30353024                case PI_PICB:
     
    30373026                case MC_PICB:
    30383027                    /* Position in Current Buffer */
    3039                     *pu32Val = pRegs->picb;
    3040                     Log3Func(("PICB[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     3028                    *pu32 = pRegs->picb;
     3029                    Log3Func(("PICB[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    30413030                    break;
    30423031                default:
    3043                     *pu32Val = UINT32_MAX;
    3044                     LogFunc(("U nabm readw %#x -> %#x\n", uPort, *pu32Val));
     3032                    *pu32 = UINT32_MAX;
     3033                    LogFunc(("U nabm readw %#x -> %#x\n", offPort, UINT32_MAX));
    30453034                    break;
    30463035            }
     
    30503039        case 4:
    30513040        {
    3052             switch (uPortIdx)
     3041            switch (offPort)
    30533042            {
    30543043                case PI_BDBAR:
     
    30563045                case MC_BDBAR:
    30573046                    /* Buffer Descriptor Base Address Register */
    3058                     *pu32Val = pRegs->bdbar;
    3059                     Log3Func(("BMADDR[%d] -> %#x\n", AC97_PORT2IDX(uPortIdx), *pu32Val));
     3047                    *pu32 = pRegs->bdbar;
     3048                    Log3Func(("BMADDR[%d] -> %#x\n", AC97_PORT2IDX(offPort), *pu32));
    30603049                    break;
    30613050                case PI_CIV:
     
    30653054                     *                Last Valid Index Register +
    30663055                     *                Status Register */
    3067                     *pu32Val = pRegs->civ | (pRegs->lvi << 8) | (pRegs->sr << 16); /** @todo r=andy Use RT_MAKE_U32_FROM_U8. */
     3056                    *pu32 = pRegs->civ | (pRegs->lvi << 8) | (pRegs->sr << 16); /** @todo r=andy Use RT_MAKE_U32_FROM_U8. */
    30683057                    Log3Func(("CIV LVI SR[%d] -> %#x, %#x, %#x\n",
    3069                               AC97_PORT2IDX(uPortIdx), pRegs->civ, pRegs->lvi, pRegs->sr));
     3058                              AC97_PORT2IDX(offPort), pRegs->civ, pRegs->lvi, pRegs->sr));
    30703059                    break;
    30713060                case PI_PICB:
     
    30753064                     *                Prefetched Index Value Register +
    30763065                     *                Control Register */
    3077                     *pu32Val = pRegs->picb | (pRegs->piv << 16) | (pRegs->cr << 24); /** @todo r=andy Use RT_MAKE_U32_FROM_U8. */
     3066                    *pu32 = pRegs->picb | (pRegs->piv << 16) | (pRegs->cr << 24); /** @todo r=andy Use RT_MAKE_U32_FROM_U8. */
    30783067                    Log3Func(("PICB PIV CR[%d] -> %#x %#x %#x %#x\n",
    3079                               AC97_PORT2IDX(uPortIdx), *pu32Val, pRegs->picb, pRegs->piv, pRegs->cr));
     3068                              AC97_PORT2IDX(offPort), *pu32, pRegs->picb, pRegs->piv, pRegs->cr));
    30803069                    break;
    30813070                case AC97_GLOB_CNT:
    30823071                    /* Global Control */
    3083                     *pu32Val = pThis->glob_cnt;
    3084                     Log3Func(("glob_cnt -> %#x\n", *pu32Val));
     3072                    *pu32 = pThis->glob_cnt;
     3073                    Log3Func(("glob_cnt -> %#x\n", *pu32));
    30853074                    break;
    30863075                case AC97_GLOB_STA:
    30873076                    /* Global Status */
    3088                     *pu32Val = pThis->glob_sta | AC97_GS_S0CR;
    3089                     Log3Func(("glob_sta -> %#x\n", *pu32Val));
     3077                    *pu32 = pThis->glob_sta | AC97_GS_S0CR;
     3078                    Log3Func(("glob_sta -> %#x\n", *pu32));
    30903079                    break;
    30913080                default:
    3092                     *pu32Val = UINT32_MAX;
    3093                     LogFunc(("U nabm readl %#x -> %#x\n", uPort, *pu32Val));
     3081                    *pu32 = UINT32_MAX;
     3082                    LogFunc(("U nabm readl %#x -> %#x\n", offPort, UINT32_MAX));
    30943083                    break;
    30953084            }
     
    31103099
    31113100/**
    3112  * Port I/O Handler for OUT operations.
    3113  *
    3114  * @returns VINF_SUCCESS or VINF_EM_*.
    3115  *
    3116  * @param   pDevIns     The device instance.
    3117  * @param   pvUser      User argument.
    3118  * @param   uPort       Port number used for the OUT operation.
    3119  * @param   u32Val      The value to output.
    3120  * @param   cbVal       The value size in bytes.
    3121  */
    3122 PDMBOTHCBDECL(int) ichac97IOPortNABMWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t u32Val, unsigned cbVal)
    3123 {
    3124     PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
     3101 * @callback_method_impl{FNIOMIOPORTNEWOUT}
     3102 */
     3103static DECLCALLBACK(VBOXSTRICTRC)
     3104ichac97IoPortNabmWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)
     3105{
     3106    PAC97STATE  pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
    31253107    RT_NOREF(pvUser);
    3126 
    3127     /* Get the index of the NABMBAR register. */
    3128     const uint32_t uPortIdx = uPort - pThis->IOPortBase[1];
    31293108
    31303109    PAC97STREAM pStream = NULL;
    31313110    PAC97BMREGS pRegs   = NULL;
    3132 
    3133     if (AC97_PORT2IDX(uPortIdx) < AC97_MAX_STREAMS)
    3134     {
    3135         pStream = &pThis->aStreams[AC97_PORT2IDX(uPortIdx)];
     3111    if (AC97_PORT2IDX(offPort) < AC97_MAX_STREAMS)
     3112    {
     3113        pStream = &pThis->aStreams[AC97_PORT2IDX(offPort)];
    31363114        AssertPtr(pStream);
    31373115        pRegs = &pStream->Regs;
     
    31403118    }
    31413119
    3142     int rc = VINF_SUCCESS;
    3143     switch (cbVal)
     3120    VBOXSTRICTRC rc = VINF_SUCCESS;
     3121    switch (cb)
    31443122    {
    31453123        case 1:
    31463124        {
    3147             switch (uPortIdx)
     3125            switch (offPort)
    31483126            {
    31493127                /*
     
    31673145#endif
    31683146                    }
    3169                     pRegs->lvi = u32Val % AC97_MAX_BDLE;
    3170                     Log3Func(("[SD%RU8] LVI <- %#x\n", pStream->u8SD, u32Val));
     3147                    pRegs->lvi = u32 % AC97_MAX_BDLE;
     3148                    Log3Func(("[SD%RU8] LVI <- %#x\n", pStream->u8SD, u32));
    31713149                    break;
    31723150                }
     
    31823160                    AssertPtr(pRegs);
    31833161#ifdef IN_RING3
    3184                     Log3Func(("[SD%RU8] CR <- %#x (cr %#x)\n", pStream->u8SD, u32Val, pRegs->cr));
    3185                     if (u32Val & AC97_CR_RR) /* Busmaster reset. */
     3162                    Log3Func(("[SD%RU8] CR <- %#x (cr %#x)\n", pStream->u8SD, u32, pRegs->cr));
     3163                    if (u32 & AC97_CR_RR) /* Busmaster reset. */
    31863164                    {
    31873165                        Log3Func(("[SD%RU8] Reset\n", pStream->u8SD));
     
    31973175                    else
    31983176                    {
    3199                         pRegs->cr = u32Val & AC97_CR_VALID_MASK;
     3177                        pRegs->cr = u32 & AC97_CR_VALID_MASK;
    32003178
    32013179                        if (!(pRegs->cr & AC97_CR_RPBM))
     
    32433221                case MC_SR:
    32443222                {
    3245                     ichac97StreamWriteSR(pThis, pStream, u32Val);
     3223                    ichac97StreamWriteSR(pThis, pStream, u32);
    32463224                    break;
    32473225                }
    32483226
    32493227                default:
    3250                     LogRel2(("AC97: Warning: Unimplemented NABMWrite (%u byte) portIdx=%#x <- %#x\n", cbVal, uPortIdx, u32Val));
     3228                    LogRel2(("AC97: Warning: Unimplemented NABMWrite offPort=%#x <- %#x LB 1\n", offPort, u32));
    32513229                    break;
    32523230            }
     
    32563234        case 2:
    32573235        {
    3258             switch (uPortIdx)
     3236            switch (offPort)
    32593237            {
    32603238                case PI_SR:
    32613239                case PO_SR:
    32623240                case MC_SR:
    3263                     ichac97StreamWriteSR(pThis, pStream, u32Val);
     3241                    ichac97StreamWriteSR(pThis, pStream, u32);
    32643242                    break;
    32653243                default:
    3266                     LogRel2(("AC97: Warning: Unimplemented NABMWrite (%u byte) portIdx=%#x <- %#x\n", cbVal, uPortIdx, u32Val));
     3244                    LogRel2(("AC97: Warning: Unimplemented NABMWrite offPort=%#x <- %#x LB 2\n", offPort, u32));
    32673245                    break;
    32683246            }
     
    32723250        case 4:
    32733251        {
    3274             switch (uPortIdx)
     3252            switch (offPort)
    32753253            {
    32763254                case PI_BDBAR:
     
    32803258                    AssertPtr(pRegs);
    32813259                    /* Buffer Descriptor list Base Address Register */
    3282                     pRegs->bdbar = u32Val & ~3;
    3283                     Log3Func(("[SD%RU8] BDBAR <- %#x (bdbar %#x)\n", AC97_PORT2IDX(uPortIdx), u32Val, pRegs->bdbar));
     3260                    pRegs->bdbar = u32 & ~3;
     3261                    Log3Func(("[SD%RU8] BDBAR <- %#x (bdbar %#x)\n", AC97_PORT2IDX(offPort), u32, pRegs->bdbar));
    32843262                    break;
    32853263                case AC97_GLOB_CNT:
    32863264                    /* Global Control */
    3287                     if (u32Val & AC97_GC_WR)
     3265                    if (u32 & AC97_GC_WR)
    32883266                        ichac97WarmReset(pThis);
    3289                     if (u32Val & AC97_GC_CR)
     3267                    if (u32 & AC97_GC_CR)
    32903268                        ichac97ColdReset(pThis);
    3291                     if (!(u32Val & (AC97_GC_WR | AC97_GC_CR)))
    3292                         pThis->glob_cnt = u32Val & AC97_GC_VALID_MASK;
    3293                     Log3Func(("glob_cnt <- %#x (glob_cnt %#x)\n", u32Val, pThis->glob_cnt));
     3269                    if (!(u32 & (AC97_GC_WR | AC97_GC_CR)))
     3270                        pThis->glob_cnt = u32 & AC97_GC_VALID_MASK;
     3271                    Log3Func(("glob_cnt <- %#x (glob_cnt %#x)\n", u32, pThis->glob_cnt));
    32943272                    break;
    32953273                case AC97_GLOB_STA:
    32963274                    /* Global Status */
    3297                     pThis->glob_sta &= ~(u32Val & AC97_GS_WCLEAR_MASK);
    3298                     pThis->glob_sta |= (u32Val & ~(AC97_GS_WCLEAR_MASK | AC97_GS_RO_MASK)) & AC97_GS_VALID_MASK;
    3299                     Log3Func(("glob_sta <- %#x (glob_sta %#x)\n", u32Val, pThis->glob_sta));
     3275                    pThis->glob_sta &= ~(u32 & AC97_GS_WCLEAR_MASK);
     3276                    pThis->glob_sta |= (u32 & ~(AC97_GS_WCLEAR_MASK | AC97_GS_RO_MASK)) & AC97_GS_VALID_MASK;
     3277                    Log3Func(("glob_sta <- %#x (glob_sta %#x)\n", u32, pThis->glob_sta));
    33003278                    break;
    33013279                default:
    3302                     LogRel2(("AC97: Warning: Unimplemented NABMWrite (%u byte) portIdx=%#x <- %#x\n", cbVal, uPortIdx, u32Val));
     3280                    LogRel2(("AC97: Warning: Unimplemented NABMWrite offPort=%#x <- %#x LB 4\n", offPort, u32));
    33033281                    break;
    33043282            }
     
    33073285
    33083286        default:
    3309             LogRel2(("AC97: Warning: Unimplemented NABMWrite (%u byte) portIdx=%#x <- %#x\n", cbVal, uPortIdx, u32Val));
     3287            AssertMsgFailed(("offPort=%#x <- %#x LB %u\n", offPort, u32, cb));
    33103288            break;
    33113289    }
     
    33183296
    33193297/**
    3320  * Port I/O Handler for IN operations.
    3321  *
    3322  * @returns VINF_SUCCESS or VINF_EM_*.
    3323  * @returns VERR_IOM_IOPORT_UNUSED if the port is really unused and a ~0 value should be returned.
    3324  *
    3325  * @param   pDevIns     The device instance.
    3326  * @param   pvUser      User argument.
    3327  * @param   uPort       Port number used for the IN operation.
    3328  * @param   pu32Val     Where to store the result.  This is always a 32-bit
    3329  *                      variable regardless of what @a cbVal might say.
    3330  * @param   cbVal       Number of bytes read.
    3331  */
    3332 PDMBOTHCBDECL(int) ichac97IOPortNAMRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t *pu32Val, unsigned cbVal)
     3298 * @callback_method_impl{FNIOMIOPORTNEWIN}
     3299 */
     3300static DECLCALLBACK(VBOXSTRICTRC)
     3301ichac97IoPortNamRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)
    33333302{
    33343303    PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
     
    33373306    DEVAC97_LOCK_RETURN(pThis, VINF_IOM_R3_IOPORT_READ);
    33383307
    3339     int rc = VINF_SUCCESS;
    3340 
    3341     uint32_t index = uPort - pThis->IOPortBase[0];
    3342     Assert(index < 256);
    3343 
    3344     switch (cbVal)
     3308    VBOXSTRICTRC rc = VINF_SUCCESS;
     3309
     3310    Assert(offPort < 256);
     3311
     3312    switch (cb)
    33453313    {
    33463314        case 1:
    33473315        {
    3348             LogRel2(("AC97: Warning: Unimplemented read (%u byte) port=%#x, idx=%RU32\n", cbVal, uPort, index));
     3316            LogRel2(("AC97: Warning: Unimplemented read (1 byte) offPort=%#x\n", offPort));
    33493317            pThis->cas = 0;
    3350             *pu32Val = UINT32_MAX;
     3318            *pu32 = UINT32_MAX;
    33513319            break;
    33523320        }
     
    33553323        {
    33563324            pThis->cas = 0;
    3357             *pu32Val = ichac97MixerGet(pThis, index);
     3325            *pu32 = ichac97MixerGet(pThis, offPort);
    33583326            break;
    33593327        }
     
    33613329        case 4:
    33623330        {
    3363             LogRel2(("AC97: Warning: Unimplemented read (%u byte) port=%#x, idx=%RU32\n", cbVal, uPort, index));
     3331            LogRel2(("AC97: Warning: Unimplemented read (4 bytes) offPort=%#x\n", offPort));
    33643332            pThis->cas = 0;
    3365             *pu32Val = UINT32_MAX;
     3333            *pu32 = UINT32_MAX;
    33663334            break;
    33673335        }
     
    33753343
    33763344    DEVAC97_UNLOCK(pThis);
    3377 
    33783345    return rc;
    33793346}
    33803347
    33813348/**
    3382  * Port I/O Handler for OUT operations.
    3383  *
    3384  * @returns VINF_SUCCESS or VINF_EM_*.
    3385  *
    3386  * @param   pDevIns     The device instance.
    3387  * @param   pvUser      User argument.
    3388  * @param   uPort       Port number used for the OUT operation.
    3389  * @param   u32Val      The value to output.
    3390  * @param   cbVal       The value size in bytes.
    3391  * @remarks Caller enters the device critical section.
    3392  */
    3393 PDMBOTHCBDECL(int) ichac97IOPortNAMWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT uPort, uint32_t u32Val, unsigned cbVal)
     3349 * @callback_method_impl{FNIOMIOPORTNEWOUT}
     3350 */
     3351static DECLCALLBACK(VBOXSTRICTRC)
     3352ichac97IoPortNamWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)
    33943353{
    33953354    PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
     
    33983357    DEVAC97_LOCK_RETURN(pThis, VINF_IOM_R3_IOPORT_WRITE);
    33993358
    3400     uint32_t uPortIdx = uPort - pThis->IOPortBase[0];
    3401 
    3402     int rc = VINF_SUCCESS;
    3403     switch (cbVal)
     3359    VBOXSTRICTRC rc = VINF_SUCCESS;
     3360    switch (cb)
    34043361    {
    34053362        case 1:
    34063363        {
    3407             LogRel2(("AC97: Warning: Unimplemented NAMWrite (%u byte) port=%#x, idx=0x%x <- %#x\n", cbVal, uPort, uPortIdx, u32Val));
     3364            LogRel2(("AC97: Warning: Unimplemented NAMWrite (1 byte) offPort=%#x <- %#x\n", offPort, u32));
    34083365            pThis->cas = 0;
    34093366            break;
     
    34133370        {
    34143371            pThis->cas = 0;
    3415             switch (uPortIdx)
     3372            switch (offPort)
    34163373            {
    34173374                case AC97_Reset:
     
    34233380                    break;
    34243381                case AC97_Powerdown_Ctrl_Stat:
    3425                     u32Val &= ~0xf;
    3426                     u32Val |= ichac97MixerGet(pThis, uPortIdx) & 0xf;
    3427                     ichac97MixerSet(pThis, uPortIdx, u32Val);
     3382                    u32 &= ~0xf;
     3383                    u32 |= ichac97MixerGet(pThis, offPort) & 0xf;
     3384                    ichac97MixerSet(pThis, offPort, u32);
    34283385                    break;
    34293386                case AC97_Master_Volume_Mute:
     
    34343391                    }
    34353392#ifdef IN_RING3
    3436                     ichac97R3MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_VOLUME_MASTER, u32Val);
     3393                    ichac97R3MixerSetVolume(pThis, offPort, PDMAUDIOMIXERCTL_VOLUME_MASTER, u32);
    34373394#else
    34383395                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34463403                            /* Register controls PCM (front) outputs. */
    34473404#ifdef IN_RING3
    3448                             ichac97R3MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_VOLUME_MASTER, u32Val);
     3405                            ichac97R3MixerSetVolume(pThis, offPort, PDMAUDIOMIXERCTL_VOLUME_MASTER, u32);
    34493406#else
    34503407                            rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34553412                case AC97_PCM_Out_Volume_Mute:
    34563413#ifdef IN_RING3
    3457                     ichac97R3MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_FRONT, u32Val);
     3414                    ichac97R3MixerSetVolume(pThis, offPort, PDMAUDIOMIXERCTL_FRONT, u32);
    34583415#else
    34593416                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34623419                case AC97_Line_In_Volume_Mute:
    34633420#ifdef IN_RING3
    3464                     ichac97R3MixerSetVolume(pThis, uPortIdx, PDMAUDIOMIXERCTL_LINE_IN, u32Val);
     3421                    ichac97R3MixerSetVolume(pThis, offPort, PDMAUDIOMIXERCTL_LINE_IN, u32);
    34653422#else
    34663423                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34693426                case AC97_Record_Select:
    34703427#ifdef IN_RING3
    3471                     ichac97R3MixerRecordSelect(pThis, u32Val);
     3428                    ichac97R3MixerRecordSelect(pThis, u32);
    34723429#else
    34733430                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34783435                    /* Newer Ubuntu guests rely on that when controlling gain and muting
    34793436                     * the recording (capturing) levels. */
    3480                     ichac97R3MixerSetGain(pThis, uPortIdx, PDMAUDIOMIXERCTL_LINE_IN, u32Val);
     3437                    ichac97R3MixerSetGain(pThis, offPort, PDMAUDIOMIXERCTL_LINE_IN, u32);
    34813438#else
    34823439                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34863443#ifdef IN_RING3
    34873444                    /* Ditto; see note above. */
    3488                     ichac97R3MixerSetGain(pThis, uPortIdx, PDMAUDIOMIXERCTL_MIC_IN,  u32Val);
     3445                    ichac97R3MixerSetGain(pThis, offPort, PDMAUDIOMIXERCTL_MIC_IN,  u32);
    34893446#else
    34903447                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    34933450                case AC97_Vendor_ID1:
    34943451                case AC97_Vendor_ID2:
    3495                     LogFunc(("Attempt to write vendor ID to %#x\n", u32Val));
     3452                    LogFunc(("Attempt to write vendor ID to %#x\n", u32));
    34963453                    break;
    34973454                case AC97_Extended_Audio_ID:
    3498                     LogFunc(("Attempt to write extended audio ID to %#x\n", u32Val));
     3455                    LogFunc(("Attempt to write extended audio ID to %#x\n", u32));
    34993456                    break;
    35003457                case AC97_Extended_Audio_Ctrl_Stat:
     
    35033460                     * Handle VRA bits.
    35043461                     */
    3505                     if (!(u32Val & AC97_EACS_VRA)) /* Check if VRA bit is not set. */
     3462                    if (!(u32 & AC97_EACS_VRA)) /* Check if VRA bit is not set. */
    35063463                    {
    35073464                        ichac97MixerSet(pThis, AC97_PCM_Front_DAC_Rate, 0xbb80); /* Set default (48000 Hz). */
     
    35173474                     * Handle VRM bits.
    35183475                     */
    3519                     if (!(u32Val & AC97_EACS_VRM)) /* Check if VRM bit is not set. */
     3476                    if (!(u32 & AC97_EACS_VRM)) /* Check if VRM bit is not set. */
    35203477                    {
    35213478                        ichac97MixerSet(pThis, AC97_MIC_ADC_Rate, 0xbb80); /* Set default (48000 Hz). */
     
    35253482                        LogRel2(("AC97: Variable rate microphone audio (VRM) is not supported\n"));
    35263483
    3527                     LogRel2(("AC97: Setting extended audio control to %#x\n", u32Val));
    3528                     ichac97MixerSet(pThis, AC97_Extended_Audio_Ctrl_Stat, u32Val);
     3484                    LogRel2(("AC97: Setting extended audio control to %#x\n", u32));
     3485                    ichac97MixerSet(pThis, AC97_Extended_Audio_Ctrl_Stat, u32);
    35293486#else /* !IN_RING3 */
    35303487                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    35353492                    if (ichac97MixerGet(pThis, AC97_Extended_Audio_Ctrl_Stat) & AC97_EACS_VRA)
    35363493                    {
    3537                         LogRel2(("AC97: Setting front DAC rate to 0x%x\n", u32Val));
    3538                         ichac97MixerSet(pThis, uPortIdx, u32Val);
     3494                        LogRel2(("AC97: Setting front DAC rate to 0x%x\n", u32));
     3495                        ichac97MixerSet(pThis, offPort, u32);
    35393496                        ichac97R3StreamReOpen(pThis, &pThis->aStreams[AC97SOUNDSOURCE_PO_INDEX], true /* fForce */);
    35403497                    }
    35413498                    else
    3542                         LogRel2(("AC97: Setting front DAC rate (0x%x) when VRA is not set is forbidden, ignoring\n", u32Val));
     3499                        LogRel2(("AC97: Setting front DAC rate (0x%x) when VRA is not set is forbidden, ignoring\n", u32));
    35433500#else
    35443501                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    35493506                    if (ichac97MixerGet(pThis, AC97_Extended_Audio_Ctrl_Stat) & AC97_EACS_VRM)
    35503507                    {
    3551                         LogRel2(("AC97: Setting microphone ADC rate to 0x%x\n", u32Val));
    3552                         ichac97MixerSet(pThis, uPortIdx, u32Val);
     3508                        LogRel2(("AC97: Setting microphone ADC rate to 0x%x\n", u32));
     3509                        ichac97MixerSet(pThis, offPort, u32);
    35533510                        ichac97R3StreamReOpen(pThis, &pThis->aStreams[AC97SOUNDSOURCE_MC_INDEX], true /* fForce */);
    35543511                    }
    35553512                    else
    3556                         LogRel2(("AC97: Setting microphone ADC rate (0x%x) when VRM is not set is forbidden, ignoring\n",
    3557                                  u32Val));
     3513                        LogRel2(("AC97: Setting microphone ADC rate (0x%x) when VRM is not set is forbidden, ignoring\n", u32));
    35583514#else
    35593515                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    35643520                    if (ichac97MixerGet(pThis, AC97_Extended_Audio_Ctrl_Stat) & AC97_EACS_VRA)
    35653521                    {
    3566                         LogRel2(("AC97: Setting line-in ADC rate to 0x%x\n", u32Val));
    3567                         ichac97MixerSet(pThis, uPortIdx, u32Val);
     3522                        LogRel2(("AC97: Setting line-in ADC rate to 0x%x\n", u32));
     3523                        ichac97MixerSet(pThis, offPort, u32);
    35683524                        ichac97R3StreamReOpen(pThis, &pThis->aStreams[AC97SOUNDSOURCE_PI_INDEX], true /* fForce */);
    35693525                    }
    35703526                    else
    3571                         LogRel2(("AC97: Setting line-in ADC rate (0x%x) when VRA is not set is forbidden, ignoring\n", u32Val));
     3527                        LogRel2(("AC97: Setting line-in ADC rate (0x%x) when VRA is not set is forbidden, ignoring\n", u32));
    35723528#else
    35733529                    rc = VINF_IOM_R3_IOPORT_WRITE;
     
    35753531                    break;
    35763532                default:
    3577                     LogRel2(("AC97: Warning: Unimplemented NAMWrite (%u byte) port=%#x, idx=0x%x <- %#x\n", cbVal, uPort, uPortIdx, u32Val));
    3578                     ichac97MixerSet(pThis, uPortIdx, u32Val);
     3533                    LogRel2(("AC97: Warning: Unimplemented NAMWrite (2 bytes) offPort=%#x <- %#x\n", offPort, u32));
     3534                    ichac97MixerSet(pThis, offPort, u32);
    35793535                    break;
    35803536            }
     
    35843540        case 4:
    35853541        {
    3586             LogRel2(("AC97: Warning: Unimplemented NAMWrite (%u byte) port=%#x, idx=0x%x <- %#x\n", cbVal, uPort, uPortIdx, u32Val));
     3542            LogRel2(("AC97: Warning: Unimplemented 4 byte NAMWrite: offPort=%#x <- %#x\n", offPort, u32));
    35873543            pThis->cas = 0;
    35883544            break;
     
    35903546
    35913547        default:
    3592             AssertMsgFailed(("Unhandled NAMWrite port=%#x, cbVal=%u u32Val=%#x\n", uPort, cbVal, u32Val));
     3548            AssertMsgFailed(("Unhandled NAMWrite offPort=%#x, cb=%u u32=%#x\n", offPort, cb, u32));
    35933549            break;
    35943550    }
    35953551
    35963552    DEVAC97_UNLOCK(pThis);
    3597 
    35983553    return rc;
    35993554}
    36003555
    36013556#ifdef IN_RING3
    3602 
    3603 /**
    3604  * @callback_method_impl{FNPCIIOREGIONMAP}
    3605  */
    3606 static DECLCALLBACK(int) ichac97R3IOPortMap(PPDMDEVINS pDevIns, PPDMPCIDEV pPciDev, uint32_t iRegion,
    3607                                             RTGCPHYS GCPhysAddress, RTGCPHYS cb, PCIADDRESSSPACE enmType)
    3608 {
    3609     PAC97STATE pThis = PDMDEVINS_2_DATA(pDevIns, PAC97STATE);
    3610     RTIOPORT   Port  = (RTIOPORT)GCPhysAddress;
    3611     RT_NOREF(pPciDev, cb, enmType);
    3612 
    3613     Assert(enmType == PCI_ADDRESS_SPACE_IO);
    3614     Assert(cb >= 0x20);
    3615     AssertReturn(iRegion <= 1, VERR_INVALID_PARAMETER); /* We support 2 regions max. at the moment. */
    3616     Assert(pPciDev == pDevIns->apPciDevs[0]);
    3617 
    3618 
    3619     int rc;
    3620     if (iRegion == 0)
    3621     {
    3622         rc = PDMDevHlpIOPortRegister(pDevIns, Port, 256, NULL, ichac97IOPortNAMWrite, ichac97IOPortNAMRead,
    3623                                      NULL, NULL, "ICHAC97 NAM");
    3624         AssertRCReturn(rc, rc);
    3625         if (pThis->fRZEnabled)
    3626         {
    3627             rc = PDMDevHlpIOPortRegisterR0(pDevIns, Port, 256, NIL_RTR0PTR, "ichac97IOPortNAMWrite", "ichac97IOPortNAMRead",
    3628                                            NULL, NULL, "ICHAC97 NAM");
    3629             AssertRCReturn(rc, rc);
    3630             rc = PDMDevHlpIOPortRegisterRC(pDevIns, Port, 256, NIL_RTRCPTR, "ichac97IOPortNAMWrite", "ichac97IOPortNAMRead",
    3631                                            NULL, NULL, "ICHAC97 NAM");
    3632             AssertRCReturn(rc, rc);
    3633         }
    3634     }
    3635     else
    3636     {
    3637         rc = PDMDevHlpIOPortRegister(pDevIns, Port, 64, NULL, ichac97IOPortNABMWrite, ichac97IOPortNABMRead,
    3638                                      NULL, NULL, "ICHAC97 NABM");
    3639         AssertRCReturn(rc, rc);
    3640         if (pThis->fRZEnabled)
    3641         {
    3642             rc = PDMDevHlpIOPortRegisterR0(pDevIns, Port, 64, NIL_RTR0PTR, "ichac97IOPortNABMWrite", "ichac97IOPortNABMRead",
    3643                                            NULL, NULL, "ICHAC97 NABM");
    3644             AssertRCReturn(rc, rc);
    3645             rc = PDMDevHlpIOPortRegisterRC(pDevIns, Port, 64, NIL_RTRCPTR, "ichac97IOPortNABMWrite", "ichac97IOPortNABMRead",
    3646                                            NULL, NULL, "ICHAC97 NABM");
    3647             AssertRCReturn(rc, rc);
    3648 
    3649         }
    3650     }
    3651 
    3652     pThis->IOPortBase[iRegion] = Port;
    3653     return VINF_SUCCESS;
    3654 }
    3655 
    36563557
    36573558/**
     
    42654166
    42664167    /*
    4267      * Register the PCI device, it's I/O regions, the timer and the
    4268      * saved state item.
     4168     * Register the PCI device and associated I/O regions.
    42694169     */
    42704170    rc = PDMDevHlpPCIRegister(pDevIns, pPciDev);
     
    42724172        return rc;
    42734173
    4274     rc = PDMDevHlpPCIIORegionRegister(pDevIns, 0, 256, PCI_ADDRESS_SPACE_IO, ichac97R3IOPortMap);
    4275     if (RT_FAILURE(rc))
    4276         return rc;
    4277 
    4278     rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1, 64, PCI_ADDRESS_SPACE_IO, ichac97R3IOPortMap);
    4279     if (RT_FAILURE(rc))
    4280         return rc;
    4281 
     4174    rc = PDMDevHlpPCIIORegionCreateIo(pDevIns, 0 /*iPciRegion*/, 256 /*cPorts*/,
     4175                                      ichac97IoPortNamWrite, ichac97IoPortNamRead, NULL /*pvUser*/,
     4176                                      "ICHAC97 NAM", NULL /*paExtDescs*/, &pThis->hIoPortsNam);
     4177    AssertRCReturn(rc, rc);
     4178
     4179    rc = PDMDevHlpPCIIORegionCreateIo(pDevIns, 1 /*iPciRegion*/, 64 /*cPorts*/,
     4180                                      ichac97IoPortNabmWrite, ichac97IoPortNabmRead, NULL /*pvUser*/,
     4181                                      "ICHAC97 NABM",  NULL /*paExtDescs*/, &pThis->hIoPortsNabm);
     4182    AssertRCReturn(rc, rc);
     4183
     4184    /*
     4185     * Saved state.
     4186     */
    42824187    rc = PDMDevHlpSSMRegister(pDevIns, AC97_SSM_VERSION, sizeof(*pThis), ichac97R3SaveExec, ichac97R3LoadExec);
    42834188    if (RT_FAILURE(rc))
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