OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
AudioDxe.c
Go to the documentation of this file.
1/*
2 * File: AudioDxe.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 "AudioDxe.h"
28#include "HdaCodec/HdaCodec.h"
30
31#include <Protocol/LoadedImage.h>
34
38EFI_DRIVER_BINDING_PROTOCOL
47
51EFI_DRIVER_BINDING_PROTOCOL
60
61EFI_STATUS
62EFIAPI
64 IN EFI_HANDLE ImageHandle,
65 IN EFI_SYSTEM_TABLE *SystemTable
66 )
67{
68 EFI_STATUS Status;
69 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
70 CHAR16 *DevicePathName;
71 OC_FLEX_ARRAY *ParsedLoadOptions;
72
73 //
74 // Parse optional driver params.
75 //
76 Status = gBS->HandleProtocol (
77 ImageHandle,
79 (VOID **)&LoadedImage
80 );
81
82 if (EFI_ERROR (Status)) {
83 return Status;
84 }
85
86 DevicePathName = NULL;
87
88 Status = OcParseLoadOptions (LoadedImage, &ParsedLoadOptions);
89 if (!EFI_ERROR (Status)) {
90 gRestoreNoSnoop = OcHasParsedVar (ParsedLoadOptions, L"--restore-nosnoop", OcStringFormatUnicode);
91
92 Status = OcParsedVarsGetInt (ParsedLoadOptions, L"--gpio-setup", &gGpioSetupStageMask, OcStringFormatUnicode);
93 if ((Status == EFI_NOT_FOUND) && OcHasParsedVar (ParsedLoadOptions, L"--gpio-setup", OcStringFormatUnicode)) {
95 }
96
98 OcParsedVarsGetInt (ParsedLoadOptions, L"--gpio-pins", &gGpioPinMask, OcStringFormatUnicode);
99 }
100
101 OcParsedVarsGetUnicodeStr (ParsedLoadOptions, L"--force-device", &DevicePathName);
102 if (DevicePathName != NULL) {
103 gForcedControllerDevicePath = ConvertTextToDevicePath (DevicePathName);
104 }
105
106 OcParsedVarsGetInt (ParsedLoadOptions, L"--codec-setup-delay", &gCodecSetupDelay, OcStringFormatUnicode);
107
108 Status = OcParsedVarsGetInt (ParsedLoadOptions, L"--force-codec", &gForcedCodec, OcStringFormatUnicode);
109 if (Status != EFI_NOT_FOUND) {
110 gUseForcedCodec = TRUE;
111 }
112
113 gCodecUseConnNoneNode = OcHasParsedVar (ParsedLoadOptions, L"--use-conn-none", OcStringFormatUnicode);
114
115 OcFlexArrayFree (&ParsedLoadOptions);
116 } else if (Status != EFI_NOT_FOUND) {
117 return Status;
118 }
119
120 DEBUG ((
121 DEBUG_INFO,
122 "HDA: GPIO stages 0x%X mask 0x%X%a; Restore NSNPEN %d; Force device %s codec %u(%u); Conn none %u; Delay %u\n",
125 gGpioPinMask == 0 ? " (auto)" : "",
127 DevicePathName,
132 ));
133
134 //
135 // Register HdaController Driver Binding.
136 //
137 Status = EfiLibInstallDriverBindingComponentName2 (
138 ImageHandle,
139 SystemTable,
141 ImageHandle,
144 );
145
146 if (EFI_ERROR (Status)) {
147 return Status;
148 }
149
150 //
151 // Register HdaCodec Driver Binding.
152 //
153 Status = EfiLibInstallDriverBindingComponentName2 (
154 ImageHandle,
155 SystemTable,
157 NULL,
160 );
161
162 ASSERT_EFI_ERROR (Status);
163 if (EFI_ERROR (Status)) {
164 return Status;
165 }
166
167 Status = gBS->InstallMultipleProtocolInterfaces (
168 &ImageHandle,
171 NULL
172 );
173
174 ASSERT_EFI_ERROR (Status);
175 if (EFI_ERROR (Status)) {
176 return Status;
177 }
178
179 return EFI_SUCCESS;
180}
EFI_AUDIO_DECODE_PROTOCOL gEfiAudioDecodeProtocol
EFI_GUID gEfiAudioDecodeProtocolGuid
EFI_DRIVER_BINDING_PROTOCOL gHdaCodecDriverBinding
Definition AudioDxe.c:52
EFI_DRIVER_BINDING_PROTOCOL gHdaControllerDriverBinding
Definition AudioDxe.c:39
EFI_STATUS EFIAPI AudioDxeInit(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition AudioDxe.c:63
#define AUDIODXE_VERSION
Definition AudioDxe.h:58
UINTN gForcedCodec
Definition HdaCodec.c:46
UINTN gCodecSetupDelay
Definition HdaCodec.c:40
BOOLEAN gCodecUseConnNoneNode
Definition HdaCodec.c:49
EFI_STATUS EFIAPI HdaCodecDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition HdaCodec.c:1717
EFI_STATUS EFIAPI HdaCodecDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition HdaCodec.c:1765
UINTN gGpioSetupStageMask
Definition HdaCodec.c:34
UINTN gGpioPinMask
Definition HdaCodec.c:37
BOOLEAN gUseForcedCodec
Definition HdaCodec.c:43
EFI_STATUS EFIAPI HdaCodecDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer OPTIONAL)
Definition HdaCodec.c:1854
#define GPIO_SETUP_STAGE_NONE
Definition HdaCodec.h:374
#define GPIO_SETUP_STAGE_ALL
Definition HdaCodec.h:376
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gHdaCodecComponentName
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gHdaCodecComponentName2
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)
BOOLEAN gRestoreNoSnoop
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gHdaControllerComponentName2
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gHdaControllerComponentName
EFI_STATUS OcParseLoadOptions(IN CONST EFI_LOADED_IMAGE_PROTOCOL *LoadedImage, OUT OC_FLEX_ARRAY **ParsedVars)
EFI_STATUS OcParsedVarsGetInt(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, OUT UINTN *Value, IN CONST OC_STRING_FORMAT StringFormat)
BOOLEAN OcHasParsedVar(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST VOID *Name, IN CONST OC_STRING_FORMAT StringFormat)
BOOLEAN OcParsedVarsGetUnicodeStr(IN CONST OC_FLEX_ARRAY *ParsedVars, IN CONST CHAR16 *Name, OUT CHAR16 **StrValue)
EFI_BOOT_SERVICES * gBS
VOID OcFlexArrayFree(IN OUT OC_FLEX_ARRAY **FlexArray)
@ OcStringFormatUnicode
Definition OcStringLib.h:51
EFI_GUID gEfiLoadedImageProtocolGuid