VirtualBox

source: vbox/trunk/src/VBox/Devices/Audio/DevHDA.h@ 82405

Last change on this file since 82405 was 82401, checked in by vboxsync, 5 years ago

DevHDA: Handle some partial/multiple register accesses (both reads and writes) in ring-0. In the read case IOM may upon our request translate a byte or word access that exactly matches the desired register into a dword access spanning multiple registers. We can only safely handle these if we know there won't be any VINF_IOM_R3_MMIO_READ statuses showing up. Fortunately we can tell that from the pfnRead functions. In the write case, the access may be a byte write to a 16-bit, 24-bit or 32-bit register. We just supply the missing bits and do it. Mind we only support doing this if it's the first byte in the register that's being accessed, but that seems to do the trick almost all of the time. bugref:9218

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.2 KB
Line 
1/* $Id: DevHDA.h 82401 2019-12-04 23:33:29Z vboxsync $ */
2/** @file
3 * DevHDA.h - VBox Intel HD Audio Controller.
4 */
5
6/*
7 * Copyright (C) 2016-2019 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18#ifndef VBOX_INCLUDED_SRC_Audio_DevHDA_h
19#define VBOX_INCLUDED_SRC_Audio_DevHDA_h
20#ifndef RT_WITHOUT_PRAGMA_ONCE
21# pragma once
22#endif
23
24#include <iprt/path.h>
25
26#include <VBox/vmm/pdmdev.h>
27
28#include "AudioMixer.h"
29
30#include "HDACodec.h"
31#include "HDAStream.h"
32#include "HDAStreamMap.h"
33#include "HDAStreamPeriod.h"
34
35
36
37/**
38 * Structure defining an HDA mixer sink.
39 * Its purpose is to know which audio mixer sink is bound to
40 * which SDn (SDI/SDO) device stream.
41 *
42 * This is needed in order to handle interleaved streams
43 * (that is, multiple channels in one stream) or non-interleaved
44 * streams (each channel has a dedicated stream).
45 *
46 * This is only known to the actual device emulation level.
47 */
48typedef struct HDAMIXERSINK
49{
50 R3PTRTYPE(PHDASTREAM) pStream;
51 /** Pointer to the actual audio mixer sink. */
52 R3PTRTYPE(PAUDMIXSINK) pMixSink;
53} HDAMIXERSINK, *PHDAMIXERSINK;
54
55/**
56 * Structure for mapping a stream tag to an HDA stream.
57 */
58typedef struct HDATAG
59{
60 /** Own stream tag. */
61 uint8_t uTag;
62 uint8_t Padding[7];
63 /** Pointer to associated stream. */
64 R3PTRTYPE(PHDASTREAM) pStream;
65} HDATAG, *PHDATAG;
66
67/** @todo Make STAM values out of this? */
68typedef struct HDASTATEDBGINFO
69{
70#ifdef DEBUG
71 /** Timestamp (in ns) of the last timer callback (hdaTimer).
72 * Used to calculate the time actually elapsed between two timer callbacks. */
73 uint64_t tsTimerLastCalledNs;
74 /** IRQ debugging information. */
75 struct
76 {
77 /** Timestamp (in ns) of last processed (asserted / deasserted) IRQ. */
78 uint64_t tsProcessedLastNs;
79 /** Timestamp (in ns) of last asserted IRQ. */
80 uint64_t tsAssertedNs;
81 /** How many IRQs have been asserted already. */
82 uint64_t cAsserted;
83 /** Accumulated elapsed time (in ns) of all IRQ being asserted. */
84 uint64_t tsAssertedTotalNs;
85 /** Timestamp (in ns) of last deasserted IRQ. */
86 uint64_t tsDeassertedNs;
87 /** How many IRQs have been deasserted already. */
88 uint64_t cDeasserted;
89 /** Accumulated elapsed time (in ns) of all IRQ being deasserted. */
90 uint64_t tsDeassertedTotalNs;
91 } IRQ;
92#endif
93 /** Whether debugging is enabled or not. */
94 bool fEnabled;
95 /** Path where to dump the debug output to.
96 * Defaults to VBOX_AUDIO_DEBUG_DUMP_PCM_DATA_PATH. */
97 char szOutPath[RTPATH_MAX + 1];
98} HDASTATEDBGINFO, *PHDASTATEDBGINFO;
99
100/**
101 * ICH Intel HD Audio Controller state.
102 */
103typedef struct HDASTATE
104{
105 /** Critical section protecting the HDA state. */
106 PDMCRITSECT CritSect;
107 /** R3 Pointer to the device instance. */
108 PPDMDEVINSR3 pDevInsR3;
109 /** The base interface for LUN\#0. */
110 PDMIBASE IBase;
111 /** The HDA's register set. */
112 uint32_t au32Regs[HDA_NUM_REGS];
113 /** Internal stream states. */
114 HDASTREAM aStreams[HDA_MAX_STREAMS];
115 /** Mapping table between stream tags and stream states. */
116 HDATAG aTags[HDA_MAX_TAGS];
117 /** CORB buffer base address. */
118 uint64_t u64CORBBase;
119 /** RIRB buffer base address. */
120 uint64_t u64RIRBBase;
121 /** DMA base address.
122 * Made out of DPLBASE + DPUBASE (3.3.32 + 3.3.33). */
123 uint64_t u64DPBase;
124 /** Pointer to CORB buffer. */
125 R3PTRTYPE(uint32_t *) pu32CorbBuf;
126 /** Size in bytes of CORB buffer. */
127 uint32_t cbCorbBuf;
128 /** Padding for alignment. */
129 uint32_t u32Padding1;
130 /** Pointer to RIRB buffer. */
131 R3PTRTYPE(uint64_t *) pu64RirbBuf;
132 /** Size in bytes of RIRB buffer. */
133 uint32_t cbRirbBuf;
134 /** DMA position buffer enable bit. */
135 bool fDMAPosition;
136 /** Reserved. */
137 bool afPadding1b[2];
138 /** Number of active (running) SDn streams. */
139 uint8_t cStreamsActive;
140 /** Pointer to HDA codec to use. */
141 R3PTRTYPE(PHDACODEC) pCodec;
142 /** List of associated LUN drivers (HDADRIVER). */
143 RTLISTANCHORR3 lstDrv;
144 /** The device' software mixer. */
145 R3PTRTYPE(PAUDIOMIXER) pMixer;
146 /** HDA sink for (front) output. */
147 HDAMIXERSINK SinkFront;
148#ifdef VBOX_WITH_AUDIO_HDA_51_SURROUND
149 /** HDA sink for center / LFE output. */
150 HDAMIXERSINK SinkCenterLFE;
151 /** HDA sink for rear output. */
152 HDAMIXERSINK SinkRear;
153#endif
154 /** HDA mixer sink for line input. */
155 HDAMIXERSINK SinkLineIn;
156#ifdef VBOX_WITH_AUDIO_HDA_MIC_IN
157 /** Audio mixer sink for microphone input. */
158 HDAMIXERSINK SinkMicIn;
159#endif
160 /** Last updated wall clock (WALCLK) counter. */
161 uint64_t u64WalClk;
162 /** Response Interrupt Count (RINTCNT). */
163 uint16_t u16RespIntCnt;
164 /** Position adjustment (in audio frames).
165 *
166 * This is not an official feature of the HDA specs, but used by
167 * certain OS drivers (e.g. snd_hda_intel) to work around certain
168 * quirks by "real" HDA hardware implementations.
169 *
170 * The position adjustment specifies how many audio frames
171 * a stream is ahead from its actual reading/writing position when
172 * starting a stream.
173 */
174 uint16_t cPosAdjustFrames;
175 /** Whether the position adjustment is enabled or not. */
176 bool fPosAdjustEnabled;
177#ifdef VBOX_STRICT
178 /** Wall clock (WALCLK) stale count.
179 * This indicates the number of set wall clock values which did not actually
180 * move the counter forward (stale). */
181 uint8_t u8WalClkStaleCnt;
182 uint8_t Padding1[2];
183#else
184 uint8_t Padding1[3];
185#endif
186 /** Current IRQ level. */
187 uint8_t u8IRQL;
188 /** The device timer Hz rate. Defaults to HDA_TIMER_HZ_DEFAULT. */
189 uint16_t uTimerHz;
190 /** Padding for alignment. */
191 uint8_t au8Padding3[3];
192 HDASTATEDBGINFO Dbg;
193
194 /** PCI Region \#0: 16KB of MMIO stuff. */
195 IOMMMIOHANDLE hMmio;
196
197#ifdef VBOX_WITH_STATISTICS
198 STAMPROFILE StatTimer;
199 STAMPROFILE StatIn;
200 STAMPROFILE StatOut;
201 STAMCOUNTER StatBytesRead;
202 STAMCOUNTER StatBytesWritten;
203
204 /** @name Register statistics.
205 * The array members run parallel to g_aHdaRegMap.
206 * @{ */
207 STAMCOUNTER aStatRegReads[HDA_NUM_REGS];
208 STAMCOUNTER aStatRegReadsToR3[HDA_NUM_REGS];
209 STAMCOUNTER aStatRegWrites[HDA_NUM_REGS];
210 STAMCOUNTER aStatRegWritesToR3[HDA_NUM_REGS];
211 STAMCOUNTER StatRegMultiReadsRZ;
212 STAMCOUNTER StatRegMultiReadsR3;
213 STAMCOUNTER StatRegMultiWritesRZ;
214 STAMCOUNTER StatRegMultiWritesR3;
215 STAMCOUNTER StatRegSubWriteRZ;
216 STAMCOUNTER StatRegSubWriteR3;
217 STAMCOUNTER StatRegUnknownReads;
218 STAMCOUNTER StatRegUnknownWrites;
219 STAMCOUNTER StatRegWritesBlockedByReset;
220 STAMCOUNTER StatRegWritesBlockedByRun;
221 /** @} */
222#endif
223 /** This is for checking that the build was correctly configured in all contexts.
224 * This is set to HDASTATE_ALIGNMENT_CHECK_MAGIC. */
225 uint64_t uAlignmentCheckMagic;
226} HDASTATE, *PHDASTATE;
227
228/** Value for HDASTATE:uAlignmentCheckMagic. */
229#define HDASTATE_ALIGNMENT_CHECK_MAGIC UINT64_C(0x1298afb75893e059)
230
231#endif /* !VBOX_INCLUDED_SRC_Audio_DevHDA_h */
232
Note: See TracBrowser for help on using the repository browser.

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