28#include <Library/BaseOverflowLib.h>
35#include <Library/PcdLib.h>
40EFI_DEVICE_PATH_PROTOCOL *
52 EFI_PCI_IO_PROTOCOL *PciIo;
55 UINT32 HdaStreamDmaPos;
56 UINT32 HdaSourceLength;
57 UINT32 HdaCurrentBlock;
81 if (EFI_ERROR (Status)) {
105 if (EFI_ERROR (Status)) {
139 DEBUG ((DEBUG_VERBOSE,
"AudioDxe: Completed playback of 0x%X buffer with 0x%X bytes read, current DMA: 0x%X\n", HdaStream->
BufferSourceLength, HdaStream->
DmaPositionTotal, HdaStreamDmaPos));
157 HdaNextBlock = HdaCurrentBlock + 1;
186 "AudioDxe: Block %u of %u filled! (current position 0x%X, buffer 0x%X)\n",
201 if (EFI_ERROR (Status)) {
214 DEBUG ((DEBUG_VERBOSE,
"HdaControllerInitPciHw(): start\n"));
217 EFI_PCI_IO_PROTOCOL *PciIo = HdaControllerDev->PciIo;
227 Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationGet, 0, &HdaControllerDev->OriginalPciAttributes);
228 if (EFI_ERROR (Status)) {
232 HdaControllerDev->OriginalPciAttributesSaved = TRUE;
233 Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSupported, 0, &PciSupports);
234 if (EFI_ERROR (Status)) {
241 PciSupports &= EFI_PCI_DEVICE_ENABLE;
242 Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable, PciSupports, NULL);
243 if (EFI_ERROR (Status)) {
250 Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, PCI_VENDOR_ID_OFFSET, 1, &HdaControllerDev->VendorId);
251 if (EFI_ERROR (Status)) {
257 "HdaControllerInitPciHw(): controller %4X:%4X\n",
267 if (EFI_ERROR (Status)) {
273 if (EFI_ERROR (Status)) {
284 if (EFI_ERROR (Status)) {
292 DEBUG ((DEBUG_INFO,
"HDA: Controller disable no snoop\n"));
293 HdaControllerDev->OriginalPciDeviceControl = HdaDevC;
294 HdaControllerDev->OriginalPciDeviceControlSaved = TRUE;
296 HdaDevC &= ~PCI_HDA_DEVC_NOSNOOPEN;
298 if (EFI_ERROR (Status)) {
306 Status = PciIo->Mem.Read (PciIo, EfiPciIoWidthUint8,
PCI_HDA_BAR,
HDA_REG_VMAJ, 1, &HdaControllerDev->MajorVersion);
307 if (EFI_ERROR (Status)) {
311 Status = PciIo->Mem.Read (PciIo, EfiPciIoWidthUint8,
PCI_HDA_BAR,
HDA_REG_VMIN, 1, &HdaControllerDev->MinorVersion);
312 if (EFI_ERROR (Status)) {
318 "HDA: Controller version %u.%u\n",
319 HdaControllerDev->MajorVersion,
320 HdaControllerDev->MinorVersion
323 Status = EFI_UNSUPPORTED;
330 Status = PciIo->Mem.Read (PciIo, EfiPciIoWidthUint16,
PCI_HDA_BAR,
HDA_REG_GCAP, 1, &HdaControllerDev->Capabilities);
331 if (EFI_ERROR (Status)) {
335 DEBUG ((DEBUG_INFO,
"HDA: Capabilities:\n"));
338 "HDA: | 64-bit: %s Serial Data Out Signals: %u\n",
344 "HDA: | Bidir streams: %u Input streams: %u Output streams: %u\n",
359 DEBUG ((DEBUG_VERBOSE,
"HdaControllerGetName(): start\n"));
365 DEBUG ((DEBUG_INFO,
"HDA: Controller is %s\n", HdaControllerDev->Name));
374 EFI_PCI_IO_PROTOCOL *PciIo;
376 if (!HdaControllerDev->OriginalPciDeviceControlSaved) {
380 PciIo = HdaControllerDev->PciIo;
382 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): restore PCI device control\n"));
383 return PciIo->Pci.Write (PciIo, EfiPciIoWidthUint16,
PCI_HDA_DEVC_OFFSET, 1, &HdaControllerDev->OriginalPciDeviceControl);
396 HdaControllerDev = Context;
416 DEBUG ((DEBUG_VERBOSE,
"HdaControllerReset(): start\n"));
419 EFI_PCI_IO_PROTOCOL *PciIo = HdaControllerDev->PciIo;
430 if (EFI_ERROR (Status)) {
435 HdaGCtl &= ~HDA_REG_GCTL_CRST;
437 if (EFI_ERROR (Status)) {
444 Status = PciIo->PollMem (
454 if (EFI_ERROR (Status)) {
466 if (
gRestoreNoSnoop && (HdaControllerDev->ExitBootServicesEvent == NULL)) {
467 Status =
gBS->CreateEvent (
468 EVT_SIGNAL_EXIT_BOOT_SERVICES,
472 &HdaControllerDev->ExitBootServicesEvent
474 if (EFI_ERROR (Status)) {
484 if (EFI_ERROR (Status)) {
491 Status = PciIo->PollMem (
501 if (EFI_ERROR (Status)) {
509 DEBUG ((DEBUG_VERBOSE,
"HdaControllerReset(): done\n"));
520 DEBUG ((DEBUG_VERBOSE,
"HdaControllerScanCodecs(%u): start\n", PreScan));
523 EFI_PCI_IO_PROTOCOL *PciIo;
527 UINT32 VendorResponse;
529 UINTN CurrentOutputStreamIndex = 0;
535 if (HdaControllerDev == NULL) {
536 return EFI_INVALID_PARAMETER;
539 PciIo = HdaControllerDev->PciIo;
545 if (EFI_ERROR (Status)) {
554 HdaCodecVerbList.
Count = 1;
555 HdaCodecVerbList.
Verbs = &VendorVerb;
556 HdaCodecVerbList.
Responses = &VendorResponse;
565 if (HdaStatests & (1 << Index)) {
571 if ((EFI_ERROR (Status)) || (VendorResponse == 0)) {
573 DEBUG ((DEBUG_INFO,
"HDA: Ignoring codec @ 0x%X - %r\n", Index, Status));
585 if (HdaIoPrivateData == NULL) {
586 Status = EFI_OUT_OF_RESOURCES;
604 if (CurrentOutputStreamIndex < HdaControllerDev->StreamsCount) {
605 DEBUG ((DEBUG_VERBOSE,
"Assigning output stream %u to codec\n", CurrentOutputStreamIndex));
606 HdaIoPrivateData->
HdaOutputStream = HdaControllerDev->Streams + CurrentOutputStreamIndex;
607 CurrentOutputStreamIndex++;
610 HdaControllerDev->HdaIoChildren[Index].PrivateData = HdaIoPrivateData;
621 if (EFI_ERROR (Status)) {
629 if (HdaControllerDev->HdaIoChildren[Index].PrivateData != NULL) {
632 HdaIoDevicePathNode.
Header.Type = MESSAGING_DEVICE_PATH;
633 HdaIoDevicePathNode.
Header.SubType = MSG_VENDOR_DP;
637 HdaIoDevicePathNode.
Address = Index;
638 HdaControllerDev->HdaIoChildren[Index].DevicePath = AppendDevicePathNode (HdaControllerDev->DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&HdaIoDevicePathNode);
639 if (HdaControllerDev->HdaIoChildren[Index].DevicePath == NULL) {
640 Status = EFI_INVALID_PARAMETER;
647 HdaControllerDev->HdaIoChildren[Index].Handle = NULL;
648 Status =
gBS->InstallMultipleProtocolInterfaces (
649 &HdaControllerDev->HdaIoChildren[Index].Handle,
651 HdaControllerDev->HdaIoChildren[Index].DevicePath,
653 &HdaControllerDev->HdaIoChildren[Index].PrivateData->HdaIo,
656 if (EFI_ERROR (Status)) {
663 Status =
gBS->OpenProtocol (
664 HdaControllerDev->ControllerHandle,
665 &gEfiPciIoProtocolGuid,
667 HdaControllerDev->DriverBinding->DriverBindingHandle,
668 HdaControllerDev->HdaIoChildren[Index].Handle,
669 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
671 if (EFI_ERROR (Status)) {
685 IN UINT8 CodecAddress,
694 EFI_PCI_IO_PROTOCOL *PciIo = HdaDev->PciIo;
699 if ((CodecAddress >=
HDA_MAX_CODECS) || (Verbs == NULL) || (Verbs->Count < 1)) {
700 return EFI_INVALID_PARAMETER;
704 HdaCorb = HdaDev->Corb.Buffer;
705 HdaRirb = HdaDev->Rirb.Buffer;
707 UINT32 RemainingVerbs;
708 UINT32 RemainingResponses;
709 UINT16 HdaCorbReadPointer;
710 UINT16 HdaRirbWritePointer;
711 BOOLEAN ResponseReceived;
712 UINT8 ResponseTimeout;
716 BOOLEAN Retry = FALSE;
719 AcquireSpinLock (&HdaDev->SpinLock);
722 RemainingVerbs = Verbs->Count;
723 RemainingResponses = Verbs->Count;
726 if (RemainingVerbs) {
729 if (EFI_ERROR (Status)) {
736 while (RemainingVerbs && ((HdaDev->Corb.Pointer + 1 % HdaDev->Corb.EntryCount) != HdaCorbReadPointer)) {
738 HdaDev->Corb.Pointer++;
739 HdaDev->Corb.Pointer %= HdaDev->Corb.EntryCount;
740 VerbCommand =
HDA_CORB_VERB (CodecAddress, Node, Verbs->Verbs[Verbs->Count - RemainingVerbs]);
741 HdaCorb[HdaDev->Corb.Pointer] = VerbCommand;
749 if (EFI_ERROR (Status)) {
755 ResponseReceived = FALSE;
756 ResponseTimeout = 10;
757 while (!ResponseReceived) {
760 if (EFI_ERROR (Status)) {
765 while (HdaDev->Rirb.Pointer != HdaRirbWritePointer) {
770 if (EFI_ERROR (Status)) {
776 HdaDev->Rirb.Pointer++;
777 HdaDev->Rirb.Pointer %= HdaDev->Rirb.EntryCount;
780 RirbResponse = HdaRirb[HdaDev->Rirb.Pointer];
782 DEBUG ((DEBUG_INFO,
"Unknown response!\n"));
787 Verbs->Responses[Verbs->Count - RemainingResponses] =
HDA_RIRB_RESP (RirbResponse);
788 RemainingResponses--;
789 ResponseReceived = TRUE;
793 if (!ResponseReceived) {
795 if (!ResponseTimeout) {
796 DEBUG ((DEBUG_INFO,
"Command: 0x%X\n", VerbCommand));
797 Status = EFI_TIMEOUT;
803 if (ResponseTimeout < 5) {
804 DEBUG ((DEBUG_INFO,
"%u timeouts reached while waiting for response!\n", ResponseTimeout));
808 }
while (RemainingVerbs || RemainingResponses);
810 Status = EFI_SUCCESS;
814 DEBUG ((DEBUG_INFO,
"Timeout!\n"));
816 DEBUG ((DEBUG_INFO,
"Stall detected, restarting CORB and RIRB!\n"));
818 if (EFI_ERROR (Status)) {
823 if (EFI_ERROR (Status)) {
828 if (EFI_ERROR (Status)) {
833 if (EFI_ERROR (Status)) {
843 ReleaseSpinLock (&HdaDev->SpinLock);
857 if (HdaControllerInfoData == NULL) {
858 return EFI_OUT_OF_RESOURCES;
869 HdaControllerDev->HdaControllerInfoData = HdaControllerInfoData;
870 Status =
gBS->InstallMultipleProtocolInterfaces (
871 &HdaControllerDev->ControllerHandle,
879 if (!EFI_ERROR (Status)) {
880 DEBUG ((DEBUG_INFO,
"HDA: Controller protocols installed\n"));
893 EFI_PCI_IO_PROTOCOL *PciIo;
895 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): start\n"));
898 if (HdaControllerDev == NULL) {
902 PciIo = HdaControllerDev->PciIo;
905 if (HdaControllerDev->ExitBootServicesEvent != NULL) {
906 gBS->CloseEvent (HdaControllerDev->ExitBootServicesEvent);
907 HdaControllerDev->ExitBootServicesEvent = NULL;
911 if (HdaControllerDev->HdaControllerInfoData != NULL) {
913 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): clean HDA Controller Info\n"));
914 Status =
gBS->UninstallProtocolInterface (
915 HdaControllerDev->ControllerHandle,
917 &HdaControllerDev->HdaControllerInfoData->HdaControllerInfo
919 ASSERT_EFI_ERROR (Status);
922 FreePool (HdaControllerDev->HdaControllerInfoData);
928 if (HdaControllerDev->HdaIoChildren[i].DevicePath != NULL) {
930 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): clean Device Path index %u\n", i));
931 Status =
gBS->UninstallProtocolInterface (
932 HdaControllerDev->HdaIoChildren[i].Handle,
934 HdaControllerDev->HdaIoChildren[i].DevicePath
936 ASSERT_EFI_ERROR (Status);
939 FreePool (HdaControllerDev->HdaIoChildren[i].DevicePath);
943 if (HdaControllerDev->HdaIoChildren[i].PrivateData != NULL) {
945 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): clean HDA I/O index %u\n", i));
946 Status =
gBS->UninstallProtocolInterface (
947 HdaControllerDev->HdaIoChildren[i].Handle,
949 &HdaControllerDev->HdaIoChildren[i].PrivateData->HdaIo
951 ASSERT_EFI_ERROR (Status);
954 FreePool (HdaControllerDev->HdaIoChildren[i].PrivateData);
973 if (HdaControllerDev->OriginalPciAttributesSaved) {
974 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): restore PCI attributes\n"));
977 EfiPciIoAttributeOperationSet,
978 HdaControllerDev->OriginalPciAttributes,
984 DEBUG ((DEBUG_VERBOSE,
"HdaControllerCleanup(): free controller device\n"));
985 gBS->UninstallProtocolInterface (
986 HdaControllerDev->ControllerHandle,
990 FreePool (HdaControllerDev);
996 IN EFI_DRIVER_BINDING_PROTOCOL *This,
997 IN EFI_HANDLE ControllerHandle,
998 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
1002 EFI_PCI_IO_PROTOCOL *PciIo;
1004 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
1009 Status =
gBS->OpenProtocol (
1011 &gEfiPciIoProtocolGuid,
1013 This->DriverBindingHandle,
1015 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1018 if (EFI_ERROR (Status)) {
1026 Status = EFI_UNSUPPORTED;
1030 if ( (DevicePath != NULL)
1033 Status = EFI_SUCCESS;
1042 Status = PciIo->Pci.Read (
1045 PCI_CLASSCODE_OFFSET,
1053 if ( !EFI_ERROR (Status)
1054 && ( (HdaClassReg.
BaseCode != PCI_CLASS_MEDIA)
1055 || (HdaClassReg.
SubClassCode != PCI_CLASS_MEDIA_MIXED_MODE)))
1057 return EFI_UNSUPPORTED;
1066 IN EFI_DRIVER_BINDING_PROTOCOL *This,
1067 IN EFI_HANDLE ControllerHandle,
1068 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
1072 EFI_PCI_IO_PROTOCOL *PciIo;
1073 EFI_DEVICE_PATH_PROTOCOL *HdaControllerDevicePath;
1082 OpenMode = EFI_OPEN_PROTOCOL_BY_DRIVER;
1090 Status =
gBS->OpenProtocol (
1092 &gEfiPciIoProtocolGuid,
1094 This->DriverBindingHandle,
1099 if ( (OpenMode == EFI_OPEN_PROTOCOL_BY_DRIVER)
1100 && (Status == EFI_ALREADY_STARTED))
1102 DEBUG ((DEBUG_INFO,
"HDA: %a%a - %r\n",
"Open PCI I/O protocol",
"", Status));
1106 if (EFI_ERROR (Status)) {
1107 if ( PcdGetBool (PcdAudioControllerTryProtocolGetMode)
1108 && (Status == EFI_ACCESS_DENIED)
1109 && (OpenMode == EFI_OPEN_PROTOCOL_BY_DRIVER))
1117 DEBUG ((DEBUG_INFO,
"HDA: %r using DRIVER mode, trying GET mode\n", Status));
1118 OpenMode = EFI_OPEN_PROTOCOL_GET_PROTOCOL;
1122 DEBUG ((DEBUG_WARN,
"HDA: %a%a - %r\n",
"Open PCI I/O protocol",
" (try DisconnectHda quirk?)", Status));
1125 }
while (EFI_ERROR (Status));
1130 Status =
gBS->OpenProtocol (
1133 (VOID **)&HdaControllerDevicePath,
1134 This->DriverBindingHandle,
1138 if (EFI_ERROR (Status)) {
1139 DEBUG ((DEBUG_WARN,
"HDA: Open device path protocol - %r\n", Status));
1147 if (HdaControllerDev == NULL) {
1148 Status = EFI_OUT_OF_RESOURCES;
1156 HdaControllerDev->
PciIo = PciIo;
1157 HdaControllerDev->
DevicePath = HdaControllerDevicePath;
1160 HdaControllerDev->
OpenMode = OpenMode;
1162 InitializeSpinLock (&HdaControllerDev->
SpinLock);
1168 if (EFI_ERROR (Status)) {
1169 DEBUG ((DEBUG_WARN,
"HDA: Init PCI HW - %r\n", Status));
1170 goto FREE_CONTROLLER;
1182 if (EFI_ERROR (Status)) {
1183 DEBUG ((DEBUG_WARN,
"HDA: Controller reset - %r\n", Status));
1184 goto FREE_CONTROLLER;
1191 if (EFI_ERROR (Status)) {
1192 DEBUG ((DEBUG_WARN,
"HDA: Install protocols - %r\n", Status));
1193 goto FREE_CONTROLLER;
1200 if (EFI_ERROR (Status)) {
1201 DEBUG ((DEBUG_WARN,
"HDA: Init CORB - %r\n", Status));
1202 goto FREE_CONTROLLER;
1206 if (EFI_ERROR (Status)) {
1207 DEBUG ((DEBUG_WARN,
"HDA: Init RIRB - %r\n", Status));
1208 goto FREE_CONTROLLER;
1215 if (EFI_ERROR (Status)) {
1216 DEBUG ((DEBUG_WARN,
"HDA: Start CORB - %r\n", Status));
1217 goto FREE_CONTROLLER;
1221 if (EFI_ERROR (Status)) {
1222 DEBUG ((DEBUG_WARN,
"HDA: Start RIRB - %r\n", Status));
1223 goto FREE_CONTROLLER;
1230 if (EFI_ERROR (Status)) {
1231 DEBUG ((DEBUG_WARN,
"HDA: Scan codecs 1/2 - %r\n", Status));
1232 goto FREE_CONTROLLER;
1239 if (EFI_ERROR (Status)) {
1240 DEBUG ((DEBUG_WARN,
"HDA: Init streams - %r\n", Status));
1241 goto FREE_CONTROLLER;
1248 if (EFI_ERROR (Status)) {
1249 DEBUG ((DEBUG_WARN,
"HDA: Scan codecs 2/2 - %r\n", Status));
1250 goto FREE_CONTROLLER;
1253 DEBUG ((DEBUG_INFO,
"HDA: Controller initialized\n"));
1268 if (OpenMode == EFI_OPEN_PROTOCOL_BY_DRIVER) {
1269 gBS->CloseProtocol (
1272 This->DriverBindingHandle,
1275 gBS->CloseProtocol (
1277 &gEfiPciIoProtocolGuid,
1278 This->DriverBindingHandle,
1289 IN EFI_DRIVER_BINDING_PROTOCOL *This,
1290 IN EFI_HANDLE ControllerHandle,
1291 IN UINTN NumberOfChildren,
1292 IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
1304 OpenMode = EFI_OPEN_PROTOCOL_BY_DRIVER;
1309 Status =
gBS->OpenProtocol (
1312 (VOID **)&HdaControllerDev,
1313 This->DriverBindingHandle,
1315 EFI_OPEN_PROTOCOL_GET_PROTOCOL
1318 if (!EFI_ERROR (Status)) {
1319 DEBUG ((DEBUG_VERBOSE,
"HDA: Cleaning up\n"));
1323 OpenMode = HdaControllerDev->
OpenMode;
1329 return EFI_INVALID_PARAMETER;
1341 if (OpenMode == EFI_OPEN_PROTOCOL_BY_DRIVER) {
1342 Status =
gBS->CloseProtocol (
1345 This->DriverBindingHandle,
1348 DEBUG ((DEBUG_VERBOSE,
"HDA: Close device path protocol - %r\n", Status));
1349 Status =
gBS->CloseProtocol (
1351 &gEfiPciIoProtocolGuid,
1352 This->DriverBindingHandle,
1355 DEBUG ((DEBUG_VERBOSE,
"HDA: Close PCI I/O protocol - %r\n", Status));
1358 DEBUG ((DEBUG_INFO,
"HDA: Disconnected\n"));
EFI_STATUS EFIAPI HdaControllerSendCommands(IN HDA_CONTROLLER_DEV *HdaDev, IN UINT8 CodecAddress, IN UINT8 Node, IN EFI_HDA_IO_VERB_LIST *Verbs)
STATIC VOID EFIAPI HdaControllerExitBootServicesHandler(IN EFI_EVENT Event, IN VOID *Context)
VOID EFIAPI HdaControllerStreamOutputPollTimerHandler(IN EFI_EVENT Event, IN VOID *Context)
EFI_STATUS EFIAPI HdaControllerInstallProtocols(IN HDA_CONTROLLER_DEV *HdaControllerDev)
EFI_STATUS EFIAPI HdaControllerReset(IN HDA_CONTROLLER_DEV *HdaControllerDev, IN BOOLEAN Restart)
EFI_STATUS EFIAPI HdaControllerDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
EFI_STATUS EFIAPI HdaControllerDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer OPTIONAL)
EFI_DEVICE_PATH_PROTOCOL * gForcedControllerDevicePath
EFI_STATUS EFIAPI HdaControllerDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
EFI_STATUS EFIAPI HdaControllerInitPciHw(IN HDA_CONTROLLER_DEV *HdaControllerDev)
EFI_STATUS EFIAPI HdaControllerScanCodecs(IN HDA_CONTROLLER_DEV *HdaControllerDev, IN BOOLEAN PreScan)
VOID EFIAPI HdaControllerCleanup(IN HDA_CONTROLLER_DEV *HdaControllerDev)
STATIC EFI_STATUS HdaControllerRestoreNoSnoopEn(IN HDA_CONTROLLER_DEV *HdaControllerDev)
VOID EFIAPI HdaControllerGetName(IN HDA_CONTROLLER_DEV *HdaControllerDev)
#define HDA_RIRB_RESP(Response)
#define HDA_CONTROLLER_QUIRK_INITIAL
EFI_STATUS HdaControllerSetRingBufferState(IN HDA_RING_BUFFER *HdaRingBuffer, IN BOOLEAN Enable, IN HDA_RING_BUFFER_TYPE Type)
VOID HdaControllerStreamIdle(IN HDA_STREAM *HdaStream)
VOID HdaControllerStreamAbort(IN HDA_STREAM *HdaStream)
#define HDA_STREAM_BUF_SIZE
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)
#define HDA_RIRB_UNSOL(Response)
EFI_STATUS EFIAPI HdaControllerHdaIoStopStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type)
#define PCI_HDA_TCSEL_TC0_MASK
EFI_STATUS EFIAPI HdaControllerHdaIoGetAddress(IN EFI_HDA_IO_PROTOCOL *This, OUT UINT8 *CodecAddress)
#define HDA_VERSION_MIN_MAJOR
#define HDA_RIRB_CAD(Response)
#define HDA_BDL_BLOCKSIZE
#define HDA_CONTROLLER_QUIRK_QEMU_1
#define HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE
#define HDA_BDL_ENTRY_COUNT
EFI_STATUS EFIAPI HdaControllerHdaIoGetStream(IN EFI_HDA_IO_PROTOCOL *This, IN EFI_HDA_IO_PROTOCOL_TYPE Type, OUT BOOLEAN *State)
#define PCI_HDA_TCSEL_OFFSET
#define HDA_STREAM_DMA_CHECK_THRESH
#define PCI_HDA_DEVC_OFFSET
#define HDA_CONTROLLER_QUIRK_CORB_NO_POLL_RESET
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)
#define HDA_CORB_VERB(Cad, Nid, Verb)
VOID HdaControllerCleanupRingBuffer(IN HDA_RING_BUFFER *HdaRingBuffer, IN HDA_RING_BUFFER_TYPE Type)
#define HDA_STREAM_BUFFER_PADDING
#define PCI_HDA_DEVC_NOSNOOPEN
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_RIRB
@ HDA_RING_BUFFER_TYPE_CORB
#define HDA_CONTROLLER_QUIRK_QEMU_2
EFI_GUID gEfiHdaControllerInfoProtocolGuid
EFI_GUID gEfiHdaIoProtocolGuid
EFI_GUID gEfiHdaIoDevicePathGuid
#define HDA_REG_SDNSTS_FIFOE
#define HDA_REG_STATESTS_CLEAR
#define HDA_REG_SDNSTS_BCIS
#define HDA_REG_GCTL_CRST
#define HDA_REG_SDNSTS_DESE
#define HDA_REG_GCAP_ISS(a)
#define HDA_REG_SDNSTS(n)
#define HDA_REG_SDNLPIB(n)
#define HDA_REG_GCAP_NSDO(a)
#define HDA_REG_GCAP_64OK
#define HDA_REG_GCAP_OSS(a)
#define HDA_REG_GCAP_BSS(a)
#define HDA_VERB_GET_PARAMETER
#define HDA_CODEC_VERB(Verb, Payload)
#define HDA_PARAMETER_VENDOR_ID
VOID DebugPrintDevicePathForHandle(IN UINTN ErrorLevel, IN CONST CHAR8 *Message, IN EFI_HANDLE Handle OPTIONAL)
BOOLEAN EFIAPI IsDevicePathEqual(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath1, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath2)
#define GET_PCI_VENDOR_ID(a)
CONST CHAR8 * OcHdaControllerGetName(IN UINT32 ControllerId)
#define GET_CODEC_VENDOR_ID(a)
#define GET_PCI_DEVICE_ID(a)
#define MS_TO_NANOSECONDS(x)
#define MS_TO_MICROSECONDS(x)
CHAR16 * AsciiStrCopyToUnicode(IN CONST CHAR8 *String, IN UINTN Length)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_GUID gEfiDevicePathProtocolGuid
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DevicePathFromHandle(IN EFI_HANDLE Handle)
HDA_DMA_POS_ENTRY * DmaPositions
EFI_PCI_IO_PROTOCOL * PciIo
EFI_DRIVER_BINDING_PROTOCOL * DriverBinding
EFI_HANDLE ControllerHandle
EFI_DEVICE_PATH_PROTOCOL * DevicePath
EFI_HDA_CONTROLLER_INFO_PROTOCOL HdaControllerInfo
HDA_CONTROLLER_DEV * HdaControllerDev
EFI_HDA_IO_PROTOCOL HdaIo
HDA_CONTROLLER_DEV * HdaControllerDev
HDA_STREAM * HdaOutputStream
EFI_HDA_CONTROLLER_INFO_GET_VENDOR_ID GetVendorId
EFI_HDA_CONTROLLER_INFO_GET_NAME GetName
EFI_DEVICE_PATH_PROTOCOL Header
EFI_HDA_IO_CLOSE_STREAM CloseStream
EFI_HDA_IO_GET_ADDRESS GetAddress
EFI_HDA_IO_START_STREAM StartStream
EFI_HDA_IO_SETUP_STREAM SetupStream
EFI_HDA_IO_SEND_COMMAND SendCommand
EFI_HDA_IO_GET_STREAM GetStream
EFI_HDA_IO_STOP_STREAM StopStream
EFI_HDA_IO_STREAM_CALLBACK Callback
UINT32 BufferSourcePosition
UINT32 BufferSourceLength
HDA_CONTROLLER_DEV * HdaDev