OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
HdaControllerHdaIo.c
Go to the documentation of this file.
1/*
2 * File: HdaControllerHdaIo.c
3 *
4 * Copyright (c) 2018 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#include "HdaController.h"
27
28// HDA I/O Device Path GUID.
30
40EFI_STATUS
41EFIAPI
43 IN EFI_HDA_IO_PROTOCOL *This,
44 OUT UINT8 *CodecAddress
45 )
46{
47 HDA_IO_PRIVATE_DATA *HdaPrivateData;
48
49 // If parameters are NULL, return error.
50 if ((This == NULL) || (CodecAddress == NULL)) {
51 return EFI_INVALID_PARAMETER;
52 }
53
54 // Get private data and codec address.
55 HdaPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
56 *CodecAddress = HdaPrivateData->HdaCodecAddress;
57 return EFI_SUCCESS;
58}
59
71EFI_STATUS
72EFIAPI
74 IN EFI_HDA_IO_PROTOCOL *This,
75 IN UINT8 Node,
76 IN UINT32 Verb,
77 OUT UINT32 *Response
78 )
79{
80 // Create verb list with single item.
81 EFI_HDA_IO_VERB_LIST HdaCodecVerbList;
82
83 HdaCodecVerbList.Count = 1;
84 HdaCodecVerbList.Verbs = &Verb;
85 HdaCodecVerbList.Responses = Response;
86
87 // Call SendCommands().
88 return HdaControllerHdaIoSendCommands (This, Node, &HdaCodecVerbList);
89}
90
101EFI_STATUS
102EFIAPI
104 IN EFI_HDA_IO_PROTOCOL *This,
105 IN UINT8 Node,
106 IN EFI_HDA_IO_VERB_LIST *Verbs
107 )
108{
109 // Create variables.
110 HDA_IO_PRIVATE_DATA *HdaPrivateData;
111
112 // If parameters are NULL, return error.
113 if ((This == NULL) || (Verbs == NULL)) {
114 return EFI_INVALID_PARAMETER;
115 }
116
117 // Get private data and send commands.
118 HdaPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
119 return HdaControllerSendCommands (HdaPrivateData->HdaControllerDev, HdaPrivateData->HdaCodecAddress, Node, Verbs);
120}
121
122EFI_STATUS
123EFIAPI
125 IN EFI_HDA_IO_PROTOCOL *This,
127 IN UINT16 Format,
128 OUT UINT8 *StreamId
129 )
130{
131 // DEBUG((DEBUG_INFO, "HdaControllerHdaIoSetupStream(): start\n"));
132
133 // Create variables.
134 EFI_STATUS Status;
135 HDA_IO_PRIVATE_DATA *HdaIoPrivateData;
136 HDA_CONTROLLER_DEV *HdaControllerDev;
137 EFI_PCI_IO_PROTOCOL *PciIo;
138
139 // Stream.
140 HDA_STREAM *HdaStream;
141 UINT16 HdaStreamFormat;
142 UINT8 HdaStreamId;
143 EFI_TPL OldTpl = 0;
144
145 // If a parameter is invalid, return error.
146 if ((This == NULL) || (Type >= EfiHdaIoTypeMaximum) || (StreamId == NULL)) {
147 return EFI_INVALID_PARAMETER;
148 }
149
150 // Get private data.
151 HdaIoPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
152 HdaControllerDev = HdaIoPrivateData->HdaControllerDev;
153 PciIo = HdaControllerDev->PciIo;
154
155 // Get stream.
156 if (Type == EfiHdaIoTypeOutput) {
157 HdaStream = HdaIoPrivateData->HdaOutputStream;
158 } else {
159 HdaStream = HdaIoPrivateData->HdaInputStream;
160 }
161
162 // Get current stream ID.
163 if (!HdaControllerGetStreamId (HdaStream, &HdaStreamId)) {
164 Status = EFI_INVALID_PARAMETER;
165 goto DONE;
166 }
167
168 // Is a stream ID allocated already? If so that means the stream is already
169 // set up and we'll need to tear it down first.
170 if (HdaStreamId > 0) {
171 Status = EFI_ALREADY_STARTED;
172 goto DONE;
173 }
174
175 // Raise TPL so we can't be messed with.
176 OldTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
177
178 // Find and allocate stream ID.
179 for (UINT8 i = HDA_STREAM_ID_MIN; i <= HDA_STREAM_ID_MAX; i++) {
180 if (!(HdaControllerDev->StreamIdMapping & (1 << i))) {
181 HdaControllerDev->StreamIdMapping |= (1 << i);
182 HdaStreamId = i;
183 break;
184 }
185 }
186
187 // If stream ID is still zero, fail.
188 if (HdaStreamId == 0) {
189 Status = EFI_OUT_OF_RESOURCES;
190 goto DONE;
191 }
192
193 // Get current format.
194 Status = PciIo->Mem.Read (
195 PciIo,
196 EfiPciIoWidthUint16,
198 HDA_REG_SDNFMT (HdaStream->Index),
199 1,
200 &HdaStreamFormat
201 );
202 if (EFI_ERROR (Status)) {
203 goto DONE;
204 }
205
206 // Reset stream if format has changed.
207 if (Format != HdaStreamFormat) {
208 // Reset stream.
209 DEBUG ((DEBUG_VERBOSE, "HdaControllerHdaIoSetupStream(): format changed, resetting stream\n"));
210 HdaControllerDev->DmaPositions[HdaStream->Index].Position = 0;
211 if (!HdaControllerResetStream (HdaStream)) {
212 Status = EFI_INVALID_PARAMETER;
213 goto DONE;
214 }
215 }
216
217 // Set stream ID.
218 if (!HdaControllerSetStreamId (HdaIoPrivateData->HdaOutputStream, HdaStreamId)) {
219 Status = EFI_INVALID_PARAMETER;
220 goto DONE;
221 }
222
223 *StreamId = HdaStreamId;
224
225 // Set stream format.
226 // DEBUG((DEBUG_INFO, "HdaControllerHdaIoSetupStream(): setting format 0x%X\n", Format));
227 Status = PciIo->Mem.Write (
228 PciIo,
229 EfiPciIoWidthUint16,
231 HDA_REG_SDNFMT (HdaStream->Index),
232 1,
233 &Format
234 );
235 if (EFI_ERROR (Status)) {
236 goto DONE;
237 }
238
239 // Stream is ready.
240 Status = EFI_SUCCESS;
241
242DONE:
243 // Restore TPL if needed.
244 if (OldTpl) {
245 gBS->RestoreTPL (OldTpl);
246 }
247
248 return Status;
249}
250
251EFI_STATUS
252EFIAPI
254 IN EFI_HDA_IO_PROTOCOL *This,
256 )
257{
258 // DEBUG((DEBUG_INFO, "HdaControllerHdaIoCloseStream(): start\n"));
259
260 // Create variables.
261 EFI_STATUS Status;
262 HDA_IO_PRIVATE_DATA *HdaIoPrivateData;
263 HDA_CONTROLLER_DEV *HdaControllerDev;
264
265 // Stream.
266 HDA_STREAM *HdaStream;
267 UINT8 HdaStreamId;
268 EFI_TPL OldTpl = 0;
269
270 // If a parameter is invalid, return error.
271 if ((This == NULL) || (Type >= EfiHdaIoTypeMaximum)) {
272 return EFI_INVALID_PARAMETER;
273 }
274
275 // Get private data.
276 HdaIoPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
277 HdaControllerDev = HdaIoPrivateData->HdaControllerDev;
278
279 // Get stream.
280 if (Type == EfiHdaIoTypeOutput) {
281 HdaStream = HdaIoPrivateData->HdaOutputStream;
282 } else {
283 HdaStream = HdaIoPrivateData->HdaInputStream;
284 }
285
286 // Get current stream ID.
287 if (!HdaControllerGetStreamId (HdaStream, &HdaStreamId)) {
288 Status = EFI_INVALID_PARAMETER;
289 goto DONE;
290 }
291
292 // Is a stream ID already at zero?
293 if (HdaStreamId == 0) {
294 Status = EFI_SUCCESS;
295 goto DONE;
296 }
297
298 // Raise TPL so we can't be messed with (but beware nested gBS->SetTimer calls).
299 OldTpl = gBS->RaiseTPL (TPL_DXE_CORE_TIMER);
300
301 // Stop stream.
302 Status = HdaControllerHdaIoStopStream (This, Type);
303 if (EFI_ERROR (Status)) {
304 goto DONE;
305 }
306
307 // Set stream ID to zero.
308 if (!HdaControllerSetStreamId (HdaStream, 0)) {
309 Status = EFI_INVALID_PARAMETER;
310 goto DONE;
311 }
312
313 // De-allocate stream ID from bitmap.
314 HdaControllerDev->StreamIdMapping &= ~(1 << HdaStreamId);
315
316 // Stream closed successfully.
317 Status = EFI_SUCCESS;
318
319DONE:
320 // Restore TPL if needed.
321 if (OldTpl) {
322 gBS->RestoreTPL (OldTpl);
323 }
324
325 return Status;
326}
327
328EFI_STATUS
329EFIAPI
331 IN EFI_HDA_IO_PROTOCOL *This,
333 OUT BOOLEAN *State
334 )
335{
336 // DEBUG((DEBUG_INFO, "HdaControllerHdaIoGetStream(): start\n"));
337
338 // Create variables.
339 HDA_IO_PRIVATE_DATA *HdaIoPrivateData;
340 HDA_STREAM *HdaStream;
341
342 // If a parameter is invalid, return error.
343 if ((This == NULL) || (Type >= EfiHdaIoTypeMaximum) || (State == NULL)) {
344 return EFI_INVALID_PARAMETER;
345 }
346
347 // Get private data.
348 HdaIoPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
349
350 // Get stream.
351 if (Type == EfiHdaIoTypeOutput) {
352 HdaStream = HdaIoPrivateData->HdaOutputStream;
353 } else {
354 HdaStream = HdaIoPrivateData->HdaInputStream;
355 }
356
357 // Get stream state.
358 if (!HdaControllerGetStreamState (HdaStream, State)) {
359 return EFI_INVALID_PARAMETER;
360 }
361
362 return EFI_SUCCESS;
363}
364
365EFI_STATUS
366EFIAPI
368 IN EFI_HDA_IO_PROTOCOL *This,
370 IN VOID *Buffer,
371 IN UINTN BufferLength,
372 IN UINTN BufferPosition OPTIONAL,
373 IN EFI_HDA_IO_STREAM_CALLBACK Callback OPTIONAL,
374 IN VOID *Context1 OPTIONAL,
375 IN VOID *Context2 OPTIONAL,
376 IN VOID *Context3 OPTIONAL
377 )
378{
379 DEBUG ((DEBUG_VERBOSE, "HdaControllerHdaIoStartStream(): start\n"));
380
381 // Create variables.
382 EFI_STATUS Status;
383 HDA_IO_PRIVATE_DATA *HdaIoPrivateData;
384 HDA_CONTROLLER_DEV *HdaControllerDev;
385 EFI_PCI_IO_PROTOCOL *PciIo;
386
387 // Stream.
388 HDA_STREAM *HdaStream;
389 UINT8 HdaStreamId;
390 UINT16 HdaStreamSts;
391 UINT32 HdaStreamDmaPos;
392 UINT32 HdaStreamDmaRemainingLength;
393 UINT32 HdaStreamCurrentBlock;
394 UINT32 HdaStreamNextBlock;
395
396 // If a parameter is invalid, return error.
397 if ((This == NULL) || (Type >= EfiHdaIoTypeMaximum) ||
398 (Buffer == NULL) || (BufferLength == 0) || (BufferPosition >= BufferLength))
399 {
400 return EFI_INVALID_PARAMETER;
401 }
402
403 // Get private data.
404 HdaIoPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
405 HdaControllerDev = HdaIoPrivateData->HdaControllerDev;
406 PciIo = HdaControllerDev->PciIo;
407
408 // Get stream.
409 if (Type == EfiHdaIoTypeOutput) {
410 HdaStream = HdaIoPrivateData->HdaOutputStream;
411 } else {
412 HdaStream = HdaIoPrivateData->HdaInputStream;
413 }
414
415 // Get current stream ID.
416 if (!HdaControllerGetStreamId (HdaStream, &HdaStreamId)) {
417 return EFI_INVALID_PARAMETER;
418 }
419
420 // Is a stream ID zero? If so that means the stream is not setup yet.
421 if (HdaStreamId == 0) {
422 return EFI_NOT_READY;
423 }
424
425 // Reset completion bit.
426 HdaStreamSts = HDA_REG_SDNSTS_BCIS;
427 Status = PciIo->Mem.Write (PciIo, EfiPciIoWidthUint8, PCI_HDA_BAR, HDA_REG_SDNSTS (HdaStream->Index), 1, &HdaStreamSts);
428 if (EFI_ERROR (Status)) {
429 return Status;
430 }
431
432 //
433 // Get current stream position through either LPIB or DMA positions buffer.
434 // LPIB fallback will occur if DMA positions buffer does not update (i.e. non-Intel controllers).
435 //
436 if (HdaStream->UseLpib) {
437 Status = PciIo->Mem.Read (PciIo, EfiPciIoWidthFifoUint32, PCI_HDA_BAR, HDA_REG_SDNLPIB (HdaStream->Index), 1, &HdaStreamDmaPos);
438 if (EFI_ERROR (Status)) {
439 return EFI_INVALID_PARAMETER;
440 }
441 } else {
442 HdaStreamDmaPos = HdaStream->HdaDev->DmaPositions[HdaStream->Index].Position;
443 }
444
445 HdaStreamCurrentBlock = HdaStreamDmaPos / HDA_BDL_BLOCKSIZE;
446 HdaStreamNextBlock = HdaStreamCurrentBlock + 1;
447 HdaStreamNextBlock %= HDA_BDL_ENTRY_COUNT;
448 DEBUG ((
449 DEBUG_INFO,
450 "HDA: Stream %u DMA pos 0x%X\n",
451 HdaStream->Index,
452 HdaStreamDmaPos
453 ));
454
455 // Save pointer to buffer.
456 HdaStream->BufferSource = Buffer;
457 HdaStream->BufferSourceLength = (UINT32)BufferLength; // TODO: All APIs will transition to 32-bit lengths/offsets.
458 HdaStream->BufferSourcePosition = (UINT32)BufferPosition;
459 HdaStream->Callback = Callback;
460 HdaStream->CallbackContext1 = Context1;
461 HdaStream->CallbackContext2 = Context2;
462 HdaStream->CallbackContext3 = Context3;
463 HdaStream->DmaPositionTotal = 0;
464
465 // Zero out buffer.
467
468 // Fill rest of current block.
469 HdaStreamDmaRemainingLength = HDA_BDL_BLOCKSIZE - (HdaStreamDmaPos - (HdaStreamCurrentBlock * HDA_BDL_BLOCKSIZE));
470 if ((HdaStream->BufferSourcePosition + HdaStreamDmaRemainingLength) > HdaStream->BufferSourceLength ) {
471 HdaStreamDmaRemainingLength = HdaStream->BufferSourceLength - HdaStream->BufferSourcePosition;
472 }
473
474 CopyMem (HdaStream->BufferData + HdaStreamDmaPos, HdaStream->BufferSource + HdaStream->BufferSourcePosition, HdaStreamDmaRemainingLength);
475 HdaStream->BufferSourcePosition += HdaStreamDmaRemainingLength;
476 DEBUG ((
477 DEBUG_VERBOSE,
478 "%u (0x%X) bytes written to 0x%X (block %u of %u)\n",
479 HdaStreamDmaRemainingLength,
480 HdaStreamDmaRemainingLength,
481 HdaStream->BufferData + HdaStreamDmaPos,
482 HdaStreamCurrentBlock,
484 ));
485
486 // Fill next block.
487 if (HdaStream->BufferSourcePosition < HdaStream->BufferSourceLength) {
488 HdaStreamDmaRemainingLength = HDA_BDL_BLOCKSIZE;
489 if ((HdaStream->BufferSourcePosition + HdaStreamDmaRemainingLength) > HdaStream->BufferSourceLength) {
490 HdaStreamDmaRemainingLength = HdaStream->BufferSourceLength - HdaStream->BufferSourcePosition;
491 }
492
493 CopyMem (HdaStream->BufferData + (HdaStreamNextBlock * HDA_BDL_BLOCKSIZE), HdaStream->BufferSource + HdaStream->BufferSourcePosition, HdaStreamDmaRemainingLength);
494 HdaStream->BufferSourcePosition += HdaStreamDmaRemainingLength;
495 DEBUG ((
496 DEBUG_VERBOSE,
497 "%u (0x%X) bytes written to 0x%X (block %u of %u)\n",
498 HdaStreamDmaRemainingLength,
499 HdaStreamDmaRemainingLength,
500 HdaStream->BufferData + (HdaStreamNextBlock * HDA_BDL_BLOCKSIZE),
501 HdaStreamNextBlock,
503 ));
504 }
505
506 // Setup polling timer.
507 HdaStream->BufferActive = TRUE;
508 Status = gBS->SetTimer (HdaStream->PollTimer, TimerPeriodic, HDA_STREAM_POLL_TIME);
509 if (EFI_ERROR (Status)) {
510 goto STOP_STREAM;
511 }
512
513 // Change stream state.
514 if (!HdaControllerSetStreamState (HdaStream, TRUE)) {
515 Status = EFI_INVALID_PARAMETER;
516 goto STOP_STREAM;
517 }
518
519 return EFI_SUCCESS;
520
521STOP_STREAM:
522 // Stop stream.
523 HdaControllerHdaIoStopStream (This, Type);
524 return Status;
525}
526
527EFI_STATUS
528EFIAPI
530 IN EFI_HDA_IO_PROTOCOL *This,
532 )
533{
534 // DEBUG((DEBUG_INFO, "HdaControllerHdaIoStopStream(): start\n"));
535
536 // Create variables.
537 EFI_STATUS Status;
538 HDA_IO_PRIVATE_DATA *HdaIoPrivateData;
539
540 // Stream.
541 HDA_STREAM *HdaStream;
542 UINT8 HdaStreamId;
543
544 // If a parameter is invalid, return error.
545 if ((This == NULL) || (Type >= EfiHdaIoTypeMaximum)) {
546 return EFI_INVALID_PARAMETER;
547 }
548
549 // Get private data.
550 HdaIoPrivateData = HDA_IO_PRIVATE_DATA_FROM_THIS (This);
551
552 // Get stream.
553 if (Type == EfiHdaIoTypeOutput) {
554 HdaStream = HdaIoPrivateData->HdaOutputStream;
555 } else {
556 HdaStream = HdaIoPrivateData->HdaInputStream;
557 }
558
559 // Get current stream ID.
560 if (!HdaControllerGetStreamId (HdaStream, &HdaStreamId)) {
561 return EFI_INVALID_PARAMETER;
562 }
563
564 // Is the stream ID zero? If so that means the stream is not setup yet.
565 if (HdaStreamId == 0) {
566 return EFI_NOT_READY;
567 }
568
569 // Cancel polling timer.
570 Status = gBS->SetTimer (HdaStream->PollTimer, TimerCancel, 0);
571 if (EFI_ERROR (Status)) {
572 return Status;
573 }
574
575 // Stop stream.
576 if (!HdaControllerSetStreamState (HdaStream, FALSE)) {
577 return EFI_INVALID_PARAMETER;
578 }
579
580 // Remove source buffer pointer.
581 HdaStream->BufferSource = NULL;
582 HdaStream->BufferSourceLength = 0;
583 HdaStream->BufferSourcePosition = 0;
584 HdaStream->Callback = NULL;
585 HdaStream->CallbackContext1 = NULL;
586 HdaStream->CallbackContext2 = NULL;
587 HdaStream->CallbackContext3 = NULL;
588 return EFI_SUCCESS;
589}
#define TPL_DXE_CORE_TIMER
Definition AudioDxe.h:69
EFI_STATUS EFIAPI HdaControllerSendCommands(IN HDA_CONTROLLER_DEV *HdaDev, IN UINT8 CodecAddress, IN UINT8 Node, IN EFI_HDA_IO_VERB_LIST *Verbs)
#define HDA_STREAM_BUF_SIZE
#define HDA_STREAM_ID_MIN
BOOLEAN HdaControllerResetStream(IN HDA_STREAM *HdaStream)
BOOLEAN HdaControllerSetStreamId(IN HDA_STREAM *HdaStream, IN UINT8 Index)
#define HDA_BDL_BLOCKSIZE
#define HDA_BDL_ENTRY_COUNT
#define HDA_IO_PRIVATE_DATA_FROM_THIS(This)
BOOLEAN HdaControllerSetStreamState(IN HDA_STREAM *HdaStream, IN BOOLEAN Run)
#define PCI_HDA_BAR
#define HDA_STREAM_POLL_TIME
BOOLEAN HdaControllerGetStreamState(IN HDA_STREAM *HdaStream, OUT BOOLEAN *Run)
BOOLEAN HdaControllerGetStreamId(IN HDA_STREAM *HdaStream, OUT UINT8 *Index)
#define HDA_STREAM_ID_MAX
EFI_STATUS EFIAPI HdaControllerHdaIoSendCommand(IN EFI_HDA_IO_PROTOCOL *This, IN UINT8 Node, IN UINT32 Verb, OUT UINT32 *Response)
EFI_STATUS EFIAPI HdaControllerHdaIoStopStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type)
EFI_GUID gEfiHdaIoDevicePathGuid
EFI_STATUS EFIAPI HdaControllerHdaIoGetAddress(IN EFI_HDA_IO_PROTOCOL *This, OUT UINT8 *CodecAddress)
EFI_STATUS EFIAPI HdaControllerHdaIoGetStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type, OUT BOOLEAN *State)
EFI_STATUS EFIAPI HdaControllerHdaIoCloseStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type)
EFI_STATUS EFIAPI HdaControllerHdaIoSetupStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type, IN UINT16 Format, OUT UINT8 *StreamId)
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 EFIAPI HdaControllerHdaIoSendCommands(IN EFI_HDA_IO_PROTOCOL *This, IN UINT8 Node, IN EFI_HDA_IO_VERB_LIST *Verbs)
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
#define EFI_HDA_IO_DEVICE_PATH_GUID
Definition HdaIo.h:196
EFI_HDA_IO_PROTOCOL_TYPE
Definition HdaIo.h:47
@ EfiHdaIoTypeOutput
Definition HdaIo.h:49
@ EfiHdaIoTypeMaximum
Definition HdaIo.h:50
#define HDA_REG_SDNSTS_BCIS
#define HDA_REG_SDNSTS(n)
#define HDA_REG_SDNLPIB(n)
#define HDA_REG_SDNFMT(n)
EFI_BOOT_SERVICES * gBS
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
@ DONE
Definition inflate.h:49
HDA_DMA_POS_ENTRY * DmaPositions
EFI_PCI_IO_PROTOCOL * PciIo
HDA_STREAM * HdaInputStream
HDA_CONTROLLER_DEV * HdaControllerDev
HDA_STREAM * HdaOutputStream
UINT32 * Verbs
Definition HdaIo.h:58
UINT32 * Responses
Definition HdaIo.h:59
EFI_EVENT PollTimer
EFI_HDA_IO_STREAM_CALLBACK Callback
UINT32 DmaPositionTotal
UINT32 BufferSourcePosition
VOID * CallbackContext1
UINT8 * BufferData
VOID * CallbackContext2
UINT32 BufferSourceLength
BOOLEAN UseLpib
UINT8 * BufferSource
VOID * CallbackContext3
BOOLEAN BufferActive
HDA_CONTROLLER_DEV * HdaDev