25#ifndef _EFI_HDA_CONTROLLER_H_
26#define _EFI_HDA_CONTROLLER_H_
31#include <Library/BaseOverflowLib.h>
36#include <Protocol/PciIo.h>
37#include <IndustryStandard/Pci.h>
47#define HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32('H','d','a','C')
57#define HDA_VERSION_MIN_MAJOR 0x1
58#define HDA_VERSION_MIN_MINOR 0x0
59#define HDA_MAX_CODECS 15
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
70#define HDA_CORB_ENTRY_SIZE sizeof(UINT32)
71#define HDA_RIRB_ENTRY_SIZE sizeof(UINT64)
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)
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)
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
106#define HDA_STREAM_DMA_CHECK_THRESH 5
124#define HDA_STREAM_ID_MIN 1
125#define HDA_STREAM_ID_MAX 15
289#define HDA_CONTROLLER_QUIRK_QEMU_1 BIT0
295#define HDA_CONTROLLER_QUIRK_QEMU_2 BIT1
304#define HDA_CONTROLLER_QUIRK_CORB_NO_POLL_RESET BIT2
306#define HDA_CONTROLLER_QUIRK_INITIAL ( \
307 HDA_CONTROLLER_QUIRK_QEMU_1 | HDA_CONTROLLER_QUIRK_CORB_NO_POLL_RESET \
380#define HDA_IO_PRIVATE_DATA_FROM_THIS(This) \
381 CR(This, HDA_IO_PRIVATE_DATA, HdaIo, HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE)
395#define HDA_CONTROLLER_INFO_PRIVATE_DATA_FROM_THIS(This) \
396 CR(This, HDA_CONTROLLER_INFO_PRIVATE_DATA, HdaControllerInfo, HDA_CONTROLLER_PRIVATE_DATA_SIGNATURE)
405 OUT UINT8 *CodecAddress
455 IN UINTN BufferLength,
456 IN UINTN BufferPosition OPTIONAL,
458 IN VOID *Context1 OPTIONAL,
459 IN VOID *Context2 OPTIONAL,
460 IN VOID *Context3 OPTIONAL
477 OUT CONST CHAR16 **Name
508 IN UINT8 CodecAddress,
519 IN EFI_DRIVER_BINDING_PROTOCOL *This,
520 IN EFI_HANDLE ControllerHandle,
521 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
527 IN EFI_DRIVER_BINDING_PROTOCOL *This,
528 IN EFI_HANDLE ControllerHandle,
529 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
535 IN EFI_DRIVER_BINDING_PROTOCOL *This,
536 IN EFI_HANDLE ControllerHandle,
537 IN UINTN NumberOfChildren,
538 IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
632EFI_DEVICE_PATH_PROTOCOL *
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)
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)
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_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)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
BOOLEAN OriginalPciAttributesSaved
BOOLEAN OriginalPciDeviceControlSaved
UINT64 OriginalPciAttributes
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
EFI_HANDLE ControllerHandle
VOID * DmaPositionsMapping
UINT16 OriginalPciDeviceControl
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_DEVICE_PATH_PROTOCOL * DevicePath
HDA_RING_BUFFER_TYPE Type
EFI_PHYSICAL_ADDRESS PhysAddr
HDA_CONTROLLER_DEV * HdaDev
EFI_HDA_IO_STREAM_CALLBACK Callback
UINT32 BufferSourcePosition
UINT32 BufferSourceLength
HDA_BDL_ENTRY * BufferList
UINT32 DmaPositionChangedMax
EFI_PHYSICAL_ADDRESS BufferDataPhysAddr
HDA_CONTROLLER_DEV * HdaDev
EFI_PHYSICAL_ADDRESS BufferListPhysAddr