OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
HdaController.h
Go to the documentation of this file.
1/*
2 * File: HdaController.h
3 *
4 * Copyright (c) 2018, 2020 John Davis
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24
25#ifndef _EFI_HDA_CONTROLLER_H_
26#define _EFI_HDA_CONTROLLER_H_
27
28#include "AudioDxe.h"
30
31#include <Library/BaseOverflowLib.h>
32
33//
34// Consumed protocols.
35//
36#include <Protocol/PciIo.h>
37#include <IndustryStandard/Pci.h>
38
39//
40// Structs.
41//
45
46// Signature for private data structures.
47#define HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32('H','d','a','C')
48
49//
50// PCI support.
51//
52
53// HDA controller is accessed via MMIO on BAR #0.
54#define PCI_HDA_BAR 0
55
56// Min supported version.
57#define HDA_VERSION_MIN_MAJOR 0x1
58#define HDA_VERSION_MIN_MINOR 0x0
59#define HDA_MAX_CODECS 15
60
61#define PCI_HDA_TCSEL_OFFSET 0x44
62#define PCI_HDA_TCSEL_TC0_MASK ~(BIT0 | BIT1 | BIT2)
63#define PCI_HDA_DEVC_OFFSET 0x78
64#define PCI_HDA_DEVC_NOSNOOPEN BIT11
65
66//
67// CORB and RIRB.
68//
69// Entry sizes.
70#define HDA_CORB_ENTRY_SIZE sizeof(UINT32)
71#define HDA_RIRB_ENTRY_SIZE sizeof(UINT64)
72
73// Misc.
74#define HDA_CORB_VERB(Cad, Nid, Verb) ((((UINT32)Cad) << 28) | (((UINT32)Nid) << 20) | (Verb & 0xFFFFF))
75#define HDA_RIRB_RESP(Response) ((UINT32)Response)
76#define HDA_RIRB_CAD(Response) ((Response >> 32) & 0xF)
77#define HDA_RIRB_UNSOL(Response) ((Response >> 36) & 0x1)
78
79//
80// Streams.
81//
82// Buffer Descriptor List Entry.
83#pragma pack(1)
84typedef struct {
85 UINT32 Address;
87 UINT32 Length;
90#pragma pack()
91
92// Buffer Descriptor List sizes. Max number of entries is 256, min is 2.
93#define HDA_BDL_ENTRY_IOC BIT0
94#define HDA_BDL_ENTRY_COUNT 2
95#define HDA_BDL_SIZE (sizeof(HDA_BDL_ENTRY) * HDA_BDL_ENTRY_COUNT)
96#define HDA_BDL_ENTRY_HALF ((HDA_BDL_ENTRY_COUNT / 2) - 1)
97#define HDA_BDL_ENTRY_LAST (HDA_BDL_ENTRY_COUNT - 1)
98
99// Buffer size and block size.
100#define HDA_STREAM_BUF_SIZE BASE_512KB
101#define HDA_STREAM_BUF_SIZE_HALF (HDA_STREAM_BUF_SIZE / 2)
102#define HDA_BDL_BLOCKSIZE (HDA_STREAM_BUF_SIZE / HDA_BDL_ENTRY_COUNT)
103#define HDA_STREAM_POLL_TIME (EFI_TIMER_PERIOD_MILLISECONDS(1))
104#define HDA_STREAM_BUFFER_PADDING 0x200 // 512 byte pad.
105
106#define HDA_STREAM_DMA_CHECK_THRESH 5
107
108//
109// DMA position structure.
110//
111#pragma pack(1)
112typedef struct {
113 //
114 // Current DMA position of hardware.
115 //
116 UINT32 Position;
117 //
118 // Reserved.
119 //
120 UINT32 Reserved;
122#pragma pack()
123
124#define HDA_STREAM_ID_MIN 1
125#define HDA_STREAM_ID_MAX 15
126
127//
128// Stream structure. All streams are assumed to be output
129// (or configured for output, if a bidirectional stream).
130//
131typedef struct {
132 //
133 // Parent HDA controller.
134 //
136 //
137 // Stream index. This value is zero-based from the first stream on the controller.
138 //
139 UINT8 Index;
140 //
141 // TRUE once Index is valid. Required for tearing down streams safely if there is
142 // an error while setting them up. Assume nothing else for this or following streams
143 // is set up or allocated if this is FALSE.
144 //
145 BOOLEAN HasIndex;
146 //
147 // Bidirectional stream? This requires a bit to set during reset to enable output.
148 //
150 //
151 // Use LPIB register instead of DMA position buffer.
152 //
153 BOOLEAN UseLpib;
154 //
155 // Count of times DMA position buffer usability is checked.
156 //
158 //
159 // Indicates whether DMA position buffer usability is complete.
160 // Ensures we don't accidentally fallback to LPIB if the stream position happens to be zero later on.
161 //
163 //
164 // Buffer Descriptor List.
165 //
167 //
168 // PCI memory mapping for BDL.
169 //
171 //
172 // Physical address of BDL.
173 //
174 EFI_PHYSICAL_ADDRESS BufferListPhysAddr;
175 //
176 // Buffer fed to BDL.
177 //
179 //
180 // PCI memory mapping of BDL buffer.
181 //
183 //
184 // Physical address of BDL buffer.
185 //
186 EFI_PHYSICAL_ADDRESS BufferDataPhysAddr;
187 //
188 // Pointer to source data buffer.
189 //
191 //
192 // Length of source data buffer.
193 //
195 //
196 // Current position in source data buffer.
197 //
199 //
200 // Source buffer currently active?
201 //
203
207
208 // Timing elements for buffer filling.
209 EFI_EVENT PollTimer;
214} HDA_STREAM;
215
216//
217// Ring buffer types.
218//
219// Command Output Ring Buffer - used for sending commands to codecs.
220// Response Input Ring Buffer - used for receiving responses from codecs.
221//
226
227//
228// Ring buffer structure.
229//
230typedef struct {
231 //
232 // Parent HDA controller.
233 //
235 //
236 // Ring buffer type.
237 //
239 //
240 // Buffer backing.
241 //
242 VOID *Buffer;
243 //
244 // Buffer size.
245 //
247 //
248 // Number of ring buffer entries.
249 //
251 //
252 // Ring buffer PCI mapping.
253 //
254 VOID *Mapping;
255 //
256 // Physical address of ring buffer.
257 //
258 EFI_PHYSICAL_ADDRESS PhysAddr;
259 //
260 // Pointer to current entry.
261 //
262 UINT16 Pointer;
264
265typedef struct {
266 EFI_HANDLE Handle;
268 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
270
271//
272// Quirks.
273//
274
275//
276// QEMU must be run in interrupt mode not polling mode in order for CORB/RIRB to work
277// at all. Unfortunately, this has to be set for all systems because CORB/RIRB must be
278// set up to detect that we are on QEMU (at least if we rely only on reported controller
279// and codec vendor ids, since QEMU controller incorrectly reports as Intel).
280// TODO: If this causes problems, we may be able to use the previous quirk (which was
281// commented out, but worked somewhat) of setting RINTCNT to 0xFF, in order to make
282// QEMU run long enough to detect that it is QEMU and then only fully enable the rest
283// of this quirk when needed.
284// Problem:
285// https://github.com/qemu/qemu/blob/a3607d/hw/audio/intel-hda.c#L331
286// Only available work-around:
287// https://github.com/qemu/qemu/blob/a3607d/hw/audio/intel-hda.c#L561
288//
289#define HDA_CONTROLLER_QUIRK_QEMU_1 BIT0
290
291//
292// Stream reset does not stay high when set.
293// REF: https://gitlab.com/qemu-project/qemu/-/issues/757
294//
295#define HDA_CONTROLLER_QUIRK_QEMU_2 BIT1
296
297//
298// CORB reset does not stay high when set; affects VMware Fusion, but also
299// some real hardware (at least Nvidia HDA controllers):
300// REF: https://github.com/acidanthera/bugtracker/issues/1908
301// For some years AudioDxe had this as default behaviour, and despite not
302// being to Intel HDA spec., it seems like retaining this may work best.
303//
304#define HDA_CONTROLLER_QUIRK_CORB_NO_POLL_RESET BIT2
305
306#define HDA_CONTROLLER_QUIRK_INITIAL ( \
307 HDA_CONTROLLER_QUIRK_QEMU_1 | HDA_CONTROLLER_QUIRK_CORB_NO_POLL_RESET \
308 )
309
311 // Signature.
313
314 // Consumed protocols and handles.
315 EFI_PCI_IO_PROTOCOL *PciIo;
316 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
317 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
319 UINT32 OpenMode;
320
321 // PCI.
326
327 // Published info protocol.
330
331 // Capabilites.
332 UINT32 VendorId;
333 CHAR16 *Name;
337
340
341 // Streams.
344
345 // DMA positions.
349 EFI_PHYSICAL_ADDRESS DmaPositionsPhysAddr;
350
351 // Bitmap for stream ID allocation.
353
354 // Events.
357 SPIN_LOCK SpinLock;
358
359 // Required quirks.
360 UINTN Quirks;
361};
362
363// HDA I/O private data.
365 // Signature.
367
368 // HDA I/O protocol.
371
372 // Assigned streams.
375
376 // HDA controller device.
378};
379
380#define HDA_IO_PRIVATE_DATA_FROM_THIS(This) \
381 CR(This, HDA_IO_PRIVATE_DATA, HdaIo, HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE)
382
383// HDA Codec Info private data.
385 // Signature.
387
388 // HDA Codec Info protocol.
390
391 // HDA controller device.
393};
394
395#define HDA_CONTROLLER_INFO_PRIVATE_DATA_FROM_THIS(This) \
396 CR(This, HDA_CONTROLLER_INFO_PRIVATE_DATA, HdaControllerInfo, HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE)
397
398//
399// HDA I/O protocol functions.
400//
401EFI_STATUS
402EFIAPI
404 IN EFI_HDA_IO_PROTOCOL *This,
405 OUT UINT8 *CodecAddress
406 );
407
408EFI_STATUS
409EFIAPI
411 IN EFI_HDA_IO_PROTOCOL *This,
412 IN UINT8 Node,
413 IN UINT32 Verb,
414 OUT UINT32 *Response
415 );
416
417EFI_STATUS
418EFIAPI
420 IN EFI_HDA_IO_PROTOCOL *This,
421 IN UINT8 Node,
422 IN EFI_HDA_IO_VERB_LIST *Verbs
423 );
424
425EFI_STATUS
426EFIAPI
428 IN EFI_HDA_IO_PROTOCOL *This,
430 IN UINT16 Format,
431 OUT UINT8 *StreamId
432 );
433
434EFI_STATUS
435EFIAPI
437 IN EFI_HDA_IO_PROTOCOL *This,
439 );
440
441EFI_STATUS
442EFIAPI
444 IN EFI_HDA_IO_PROTOCOL *This,
446 OUT BOOLEAN *State
447 );
448
449EFI_STATUS
450EFIAPI
452 IN EFI_HDA_IO_PROTOCOL *This,
454 IN VOID *Buffer,
455 IN UINTN BufferLength,
456 IN UINTN BufferPosition OPTIONAL,
457 IN EFI_HDA_IO_STREAM_CALLBACK Callback OPTIONAL,
458 IN VOID *Context1 OPTIONAL,
459 IN VOID *Context2 OPTIONAL,
460 IN VOID *Context3 OPTIONAL
461 );
462
463EFI_STATUS
464EFIAPI
466 IN EFI_HDA_IO_PROTOCOL *This,
468 );
469
470//
471// HDA Controller Info protcol functions.
472//
473EFI_STATUS
474EFIAPI
477 OUT CONST CHAR16 **Name
478 );
479
480EFI_STATUS
481EFIAPI
484 OUT UINT32 *VendorId
485 );
486
487//
488// HDA controller internal functions.
489//
490VOID
491EFIAPI
493 IN EFI_EVENT Event,
494 IN VOID *Context
495 );
496
497EFI_STATUS
498EFIAPI
500 IN HDA_CONTROLLER_DEV *HdaControllerDev,
501 IN BOOLEAN Restart
502 );
503
504EFI_STATUS
505EFIAPI
507 IN HDA_CONTROLLER_DEV *HdaDev,
508 IN UINT8 CodecAddress,
509 IN UINT8 Node,
510 IN EFI_HDA_IO_VERB_LIST *Verbs
511 );
512
513//
514// Driver Binding protocol functions.
515//
516EFI_STATUS
517EFIAPI
519 IN EFI_DRIVER_BINDING_PROTOCOL *This,
520 IN EFI_HANDLE ControllerHandle,
521 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
522 );
523
524EFI_STATUS
525EFIAPI
527 IN EFI_DRIVER_BINDING_PROTOCOL *This,
528 IN EFI_HANDLE ControllerHandle,
529 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
530 );
531
532EFI_STATUS
533EFIAPI
535 IN EFI_DRIVER_BINDING_PROTOCOL *This,
536 IN EFI_HANDLE ControllerHandle,
537 IN UINTN NumberOfChildren,
538 IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
539 );
540
541EFI_STATUS
543 IN HDA_RING_BUFFER *HdaRingBuffer,
544 IN HDA_CONTROLLER_DEV *HdaDev,
546 );
547
548VOID
550 IN HDA_RING_BUFFER *HdaRingBuffer,
552 );
553
554EFI_STATUS
556 IN HDA_RING_BUFFER *HdaRingBuffer,
557 IN BOOLEAN Enable,
559 );
560
561EFI_STATUS
563 IN HDA_RING_BUFFER *HdaRingBuffer
564 );
565
566EFI_STATUS
568 IN HDA_CONTROLLER_DEV *HdaDev
569 );
570
571BOOLEAN
573 IN HDA_STREAM *HdaStream
574 );
575
576VOID
578 IN HDA_CONTROLLER_DEV *HdaDev
579 );
580
581BOOLEAN
583 IN HDA_STREAM *HdaStream,
584 OUT BOOLEAN *Run
585 );
586
587BOOLEAN
589 IN HDA_STREAM *HdaStream,
590 IN BOOLEAN Run
591 );
592
593BOOLEAN
595 IN HDA_STREAM *HdaStream,
596 OUT UINT32 *Position
597 );
598
599BOOLEAN
601 IN HDA_STREAM *HdaStream,
602 OUT UINT8 *Index
603 );
604
605BOOLEAN
607 IN HDA_STREAM *HdaStream,
608 IN UINT8 Index
609 );
610
611VOID
613 IN HDA_STREAM *HdaStream
614 );
615
616VOID
618 IN HDA_STREAM *HdaStream
619 );
620
621//
622// Whether to restore NOSNOOPEN at exit.
623//
624extern
625BOOLEAN
627
628//
629// Forced device path for HDA controller (ignore advertised class/subclass).
630//
631extern
632EFI_DEVICE_PATH_PROTOCOL *
634
635#endif
EFI_STATUS HdaControllerSetRingBufferState(IN HDA_RING_BUFFER *HdaRingBuffer, IN BOOLEAN Enable, IN HDA_RING_BUFFER_TYPE Type)
VOID HdaControllerStreamIdle(IN HDA_STREAM *HdaStream)
EFI_STATUS EFIAPI HdaControllerSendCommands(IN HDA_CONTROLLER_DEV *HdaDev, IN UINT8 CodecAddress, IN UINT8 Node, IN EFI_HDA_IO_VERB_LIST *Verbs)
VOID HdaControllerStreamAbort(IN HDA_STREAM *HdaStream)
EFI_STATUS EFIAPI HdaControllerHdaIoSendCommand(IN EFI_HDA_IO_PROTOCOL *This, IN UINT8 Node, IN UINT32 Verb, OUT UINT32 *Response)
EFI_STATUS HdaControllerInitStreams(IN HDA_CONTROLLER_DEV *HdaDev)
EFI_STATUS EFIAPI HdaControllerHdaIoStopStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type)
VOID EFIAPI HdaControllerStreamOutputPollTimerHandler(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS EFIAPI HdaControllerReset(IN HDA_CONTROLLER_DEV *HdaControllerDev, IN BOOLEAN Restart)
EFI_STATUS EFIAPI HdaControllerHdaIoGetAddress(IN EFI_HDA_IO_PROTOCOL *This, OUT UINT8 *CodecAddress)
EFI_STATUS EFIAPI HdaControllerDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
BOOLEAN HdaControllerResetStream(IN HDA_STREAM *HdaStream)
EFI_STATUS EFIAPI HdaControllerDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer OPTIONAL)
BOOLEAN HdaControllerSetStreamId(IN HDA_STREAM *HdaStream, IN UINT8 Index)
EFI_DEVICE_PATH_PROTOCOL * gForcedControllerDevicePath
EFI_STATUS EFIAPI HdaControllerHdaIoGetStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type, OUT BOOLEAN *State)
EFI_STATUS EFIAPI HdaControllerDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
#define HDA_MAX_CODECS
BOOLEAN HdaControllerSetStreamState(IN HDA_STREAM *HdaStream, IN BOOLEAN Run)
EFI_STATUS EFIAPI HdaControllerHdaIoCloseStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type)
EFI_STATUS EFIAPI HdaControllerInfoGetVendorId(IN EFI_HDA_CONTROLLER_INFO_PROTOCOL *This, OUT UINT32 *VendorId)
EFI_STATUS EFIAPI HdaControllerHdaIoSetupStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type, IN UINT16 Format, OUT UINT8 *StreamId)
BOOLEAN HdaControllerGetStreamLinkPos(IN HDA_STREAM *HdaStream, OUT UINT32 *Position)
BOOLEAN gRestoreNoSnoop
VOID HdaControllerCleanupRingBuffer(IN HDA_RING_BUFFER *HdaRingBuffer, IN HDA_RING_BUFFER_TYPE Type)
EFI_STATUS HdaControllerResetRingBuffer(IN HDA_RING_BUFFER *HdaRingBuffer)
BOOLEAN HdaControllerGetStreamState(IN HDA_STREAM *HdaStream, OUT BOOLEAN *Run)
EFI_STATUS EFIAPI HdaControllerInfoGetName(IN EFI_HDA_CONTROLLER_INFO_PROTOCOL *This, OUT CONST CHAR16 **Name)
EFI_STATUS EFIAPI HdaControllerHdaIoStartStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type, IN VOID *Buffer, IN UINTN BufferLength, IN UINTN BufferPosition OPTIONAL, IN EFI_HDA_IO_STREAM_CALLBACK Callback OPTIONAL, IN VOID *Context1 OPTIONAL, IN VOID *Context2 OPTIONAL, IN VOID *Context3 OPTIONAL)
EFI_STATUS HdaControllerInitRingBuffer(IN HDA_RING_BUFFER *HdaRingBuffer, IN HDA_CONTROLLER_DEV *HdaDev, IN HDA_RING_BUFFER_TYPE Type)
VOID HdaControllerCleanupStreams(IN HDA_CONTROLLER_DEV *HdaDev)
HDA_RING_BUFFER_TYPE
@ HDA_RING_BUFFER_TYPE_RIRB
@ HDA_RING_BUFFER_TYPE_CORB
EFI_STATUS EFIAPI HdaControllerHdaIoSendCommands(IN EFI_HDA_IO_PROTOCOL *This, IN UINT8 Node, IN EFI_HDA_IO_VERB_LIST *Verbs)
BOOLEAN HdaControllerGetStreamId(IN HDA_STREAM *HdaStream, OUT UINT8 *Index)
VOID(EFIAPI * EFI_HDA_IO_STREAM_CALLBACK)(IN EFI_HDA_IO_PROTOCOL_TYPE Type, IN VOID *Context1, IN VOID *Context2, IN VOID *Context3)
Definition HdaIo.h:67
EFI_HDA_IO_PROTOCOL_TYPE
Definition HdaIo.h:47
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
BOOLEAN OriginalPciAttributesSaved
BOOLEAN OriginalPciDeviceControlSaved
HDA_CONTROLLER_INFO_PRIVATE_DATA * HdaControllerInfoData
EFI_EVENT ExitBootServicesEvent
HDA_IO_CHILD HdaIoChildren[HDA_MAX_CODECS]
HDA_DMA_POS_ENTRY * DmaPositions
EFI_PCI_IO_PROTOCOL * PciIo
EFI_DRIVER_BINDING_PROTOCOL * DriverBinding
EFI_EVENT ResponsePollTimer
HDA_RING_BUFFER Rirb
EFI_HANDLE ControllerHandle
HDA_RING_BUFFER Corb
EFI_PHYSICAL_ADDRESS DmaPositionsPhysAddr
EFI_DEVICE_PATH_PROTOCOL * DevicePath
EFI_HDA_CONTROLLER_INFO_PROTOCOL HdaControllerInfo
HDA_CONTROLLER_DEV * HdaControllerDev
EFI_HDA_IO_PROTOCOL HdaIo
HDA_STREAM * HdaInputStream
HDA_CONTROLLER_DEV * HdaControllerDev
HDA_STREAM * HdaOutputStream
UINT32 InterruptOnCompletion
HDA_IO_PRIVATE_DATA * PrivateData
EFI_HANDLE Handle
EFI_DEVICE_PATH_PROTOCOL * DevicePath
HDA_RING_BUFFER_TYPE Type
EFI_PHYSICAL_ADDRESS PhysAddr
HDA_CONTROLLER_DEV * HdaDev
BOOLEAN DmaCheckComplete
EFI_EVENT PollTimer
EFI_HDA_IO_STREAM_CALLBACK Callback
UINT32 DmaPositionTotal
UINT32 BufferSourcePosition
VOID * CallbackContext1
UINT8 * BufferData
VOID * CallbackContext2
UINT32 BufferSourceLength
HDA_BDL_ENTRY * BufferList
UINT32 DmaPositionLast
BOOLEAN UseLpib
BOOLEAN HasIndex
UINT8 * BufferSource
VOID * CallbackContext3
BOOLEAN BufferActive
VOID * BufferListMapping
UINT32 DmaPositionChangedMax
UINT32 DmaCheckCount
EFI_PHYSICAL_ADDRESS BufferDataPhysAddr
HDA_CONTROLLER_DEV * HdaDev
VOID * BufferDataMapping
EFI_PHYSICAL_ADDRESS BufferListPhysAddr
BOOLEAN IsBidirectional