]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/WinNtGopDxe/WinNtGopDriver.c
Nt32Pkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Nt32Pkg / WinNtGopDxe / WinNtGopDriver.c
CommitLineData
c9fc89a3 1/** @file\r
2\r
8f2a5f80 3Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>\r
9d2eedba 4SPDX-License-Identifier: BSD-2-Clause-Patent\r
c9fc89a3 5\r
6Module Name:\r
7\r
8 WinNtGopDriver.c\r
9\r
10Abstract:\r
11\r
12 This file implements the UEFI Device Driver model requirements for GOP\r
13\r
14 GOP is short hand for Graphics Output Protocol.\r
15\r
16\r
17**/\r
62cf113f 18#include "WinNtGop.h"\r
c9fc89a3 19\r
62cf113f 20EFI_STATUS\r
21FreeNotifyList (\r
22 IN OUT LIST_ENTRY *ListHead\r
23 )\r
24/*++\r
c9fc89a3 25\r
62cf113f 26Routine Description:\r
27\r
28Arguments:\r
29\r
30 ListHead - The list head\r
31\r
32Returns:\r
33\r
34 EFI_SUCCESS - Free the notify list successfully\r
35 EFI_INVALID_PARAMETER - ListHead is invalid.\r
36\r
37--*/\r
38{\r
39 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NotifyNode;\r
40\r
41 if (ListHead == NULL) {\r
42 return EFI_INVALID_PARAMETER;\r
43 }\r
44 while (!IsListEmpty (ListHead)) {\r
45 NotifyNode = CR (\r
46 ListHead->ForwardLink, \r
47 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY, \r
48 NotifyEntry, \r
49 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
50 );\r
51 RemoveEntryList (ListHead->ForwardLink);\r
52 gBS->FreePool (NotifyNode);\r
53 }\r
54 \r
55 return EFI_SUCCESS;\r
56}\r
c9fc89a3 57\r
58EFI_DRIVER_BINDING_PROTOCOL gWinNtGopDriverBinding = {\r
59 WinNtGopDriverBindingSupported,\r
60 WinNtGopDriverBindingStart,\r
61 WinNtGopDriverBindingStop,\r
62 0xa,\r
63 NULL,\r
64 NULL\r
65};\r
66\r
67/**\r
68 The user Entry Point for module WinNtGop. The user code starts with this function.\r
69\r
70 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
71 @param[in] SystemTable A pointer to the EFI System Table.\r
72 \r
73 @retval EFI_SUCCESS The entry point is executed successfully.\r
74 @retval other Some error occurs when executing this entry point.\r
75\r
76**/\r
77EFI_STATUS\r
78EFIAPI\r
79InitializeWinNtGop(\r
80 IN EFI_HANDLE ImageHandle,\r
81 IN EFI_SYSTEM_TABLE *SystemTable\r
82 )\r
83{\r
84 EFI_STATUS Status;\r
85\r
86 //\r
87 // Install driver model protocol(s).\r
88 //\r
e6e53c97 89 Status = EfiLibInstallDriverBindingComponentName2 (\r
c9fc89a3 90 ImageHandle,\r
91 SystemTable,\r
92 &gWinNtGopDriverBinding,\r
93 ImageHandle,\r
94 &gWinNtGopComponentName,\r
e6e53c97 95 &gWinNtGopComponentName2\r
c9fc89a3 96 );\r
97 ASSERT_EFI_ERROR (Status);\r
98\r
99\r
100 return Status;\r
101}\r
102\r
103/**\r
104\r
105\r
106 @return None\r
107\r
108**/\r
109// TODO: This - add argument and description to function comment\r
110// TODO: Handle - add argument and description to function comment\r
111// TODO: RemainingDevicePath - add argument and description to function comment\r
112EFI_STATUS\r
113EFIAPI\r
114WinNtGopDriverBindingSupported (\r
115 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
116 IN EFI_HANDLE Handle,\r
117 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
118 )\r
119{\r
120 EFI_STATUS Status;\r
121 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
122\r
123 //\r
124 // Open the IO Abstraction(s) needed to perform the supported test\r
125 //\r
126 Status = gBS->OpenProtocol (\r
127 Handle,\r
128 &gEfiWinNtIoProtocolGuid,\r
63941829 129 (VOID **) &WinNtIo,\r
c9fc89a3 130 This->DriverBindingHandle,\r
131 Handle,\r
132 EFI_OPEN_PROTOCOL_BY_DRIVER\r
133 );\r
134 if (EFI_ERROR (Status)) {\r
135 return Status;\r
136 }\r
137\r
138 Status = WinNtGopSupported (WinNtIo);\r
139\r
140 //\r
141 // Close the I/O Abstraction(s) used to perform the supported test\r
142 //\r
143 gBS->CloseProtocol (\r
144 Handle,\r
145 &gEfiWinNtIoProtocolGuid,\r
146 This->DriverBindingHandle,\r
147 Handle\r
148 );\r
149\r
150 return Status;\r
151}\r
152\r
153\r
154/**\r
155\r
156\r
157 @return None\r
158\r
159**/\r
160// TODO: This - add argument and description to function comment\r
161// TODO: Handle - add argument and description to function comment\r
162// TODO: RemainingDevicePath - add argument and description to function comment\r
163// TODO: EFI_UNSUPPORTED - add return value to function comment\r
164EFI_STATUS\r
165EFIAPI\r
166WinNtGopDriverBindingStart (\r
167 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
168 IN EFI_HANDLE Handle,\r
169 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
170 )\r
171{\r
172 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
173 EFI_STATUS Status;\r
174 GOP_PRIVATE_DATA *Private;\r
175\r
176 //\r
177 // Grab the protocols we need\r
178 //\r
179 Status = gBS->OpenProtocol (\r
180 Handle,\r
181 &gEfiWinNtIoProtocolGuid,\r
63941829 182 (VOID **) &WinNtIo,\r
c9fc89a3 183 This->DriverBindingHandle,\r
184 Handle,\r
185 EFI_OPEN_PROTOCOL_BY_DRIVER\r
186 );\r
187 if (EFI_ERROR (Status)) {\r
188 return EFI_UNSUPPORTED;\r
189 }\r
190\r
191 //\r
192 // Allocate Private context data for SGO inteface.\r
193 //\r
194 Private = NULL;\r
195 Private = AllocatePool (sizeof (GOP_PRIVATE_DATA));\r
196 if (Private == NULL) {\r
62cf113f 197 Status = EFI_OUT_OF_RESOURCES;\r
c9fc89a3 198 goto Done;\r
199 }\r
200 //\r
201 // Set up context record\r
202 //\r
203 Private->Signature = GOP_PRIVATE_DATA_SIGNATURE;\r
204 Private->Handle = Handle;\r
205 Private->WinNtThunk = WinNtIo->WinNtThunk;\r
206\r
207 Private->ControllerNameTable = NULL;\r
208\r
e6e53c97 209 AddUnicodeString2 (\r
c9fc89a3 210 "eng",\r
211 gWinNtGopComponentName.SupportedLanguages,\r
212 &Private->ControllerNameTable,\r
e6e53c97 213 WinNtIo->EnvString,\r
214 TRUE\r
c9fc89a3 215 );\r
e6e53c97 216 AddUnicodeString2 (\r
217 "en",\r
218 gWinNtGopComponentName2.SupportedLanguages,\r
219 &Private->ControllerNameTable,\r
220 WinNtIo->EnvString,\r
221 FALSE\r
222 );\r
223\r
c9fc89a3 224\r
225 Private->WindowName = WinNtIo->EnvString;\r
226\r
227 Status = WinNtGopConstructor (Private);\r
228 if (EFI_ERROR (Status)) {\r
229 goto Done;\r
230 }\r
231 //\r
232 // Publish the Gop interface to the world\r
233 //\r
234 Status = gBS->InstallMultipleProtocolInterfaces (\r
235 &Private->Handle,\r
236 &gEfiGraphicsOutputProtocolGuid,\r
237 &Private->GraphicsOutput,\r
238 &gEfiSimpleTextInProtocolGuid,\r
239 &Private->SimpleTextIn,\r
62cf113f 240 &gEfiSimpleTextInputExProtocolGuid,\r
241 &Private->SimpleTextInEx,\r
c9fc89a3 242 NULL\r
243 );\r
244\r
245Done:\r
246 if (EFI_ERROR (Status)) {\r
247\r
248 gBS->CloseProtocol (\r
249 Handle,\r
250 &gEfiWinNtIoProtocolGuid,\r
251 This->DriverBindingHandle,\r
252 Handle\r
253 );\r
254\r
255 if (Private != NULL) {\r
256 //\r
257 // On Error Free back private data\r
258 //\r
259 if (Private->ControllerNameTable != NULL) {\r
260 FreeUnicodeStringTable (Private->ControllerNameTable);\r
261 }\r
262\r
62cf113f 263 if (Private->SimpleTextIn.WaitForKey != NULL) {\r
264 gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
265 }\r
266 if (Private->SimpleTextInEx.WaitForKeyEx != NULL) {\r
267 gBS->CloseEvent (Private->SimpleTextInEx.WaitForKeyEx);\r
268 }\r
269 FreeNotifyList (&Private->NotifyList);\r
c9fc89a3 270 FreePool (Private);\r
271 }\r
272 }\r
273\r
274 return Status;\r
275}\r
276\r
277\r
278/**\r
279\r
280\r
281 @return None\r
282\r
283**/\r
284// TODO: This - add argument and description to function comment\r
285// TODO: Handle - add argument and description to function comment\r
286// TODO: NumberOfChildren - add argument and description to function comment\r
287// TODO: ChildHandleBuffer - add argument and description to function comment\r
288// TODO: EFI_NOT_STARTED - add return value to function comment\r
289// TODO: EFI_DEVICE_ERROR - add return value to function comment\r
290EFI_STATUS\r
291EFIAPI\r
292WinNtGopDriverBindingStop (\r
293 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
294 IN EFI_HANDLE Handle,\r
295 IN UINTN NumberOfChildren,\r
296 IN EFI_HANDLE *ChildHandleBuffer\r
297 )\r
298{\r
299 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
300 EFI_STATUS Status;\r
301 GOP_PRIVATE_DATA *Private;\r
302\r
303 Status = gBS->OpenProtocol (\r
304 Handle,\r
305 &gEfiGraphicsOutputProtocolGuid,\r
63941829 306 (VOID **) &GraphicsOutput,\r
c9fc89a3 307 This->DriverBindingHandle,\r
308 Handle,\r
309 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
310 );\r
311 if (EFI_ERROR (Status)) {\r
312 //\r
313 // If the GOP interface does not exist the driver is not started\r
314 //\r
315 return EFI_NOT_STARTED;\r
316 }\r
317\r
318 //\r
319 // Get our private context information\r
320 //\r
321 Private = GOP_PRIVATE_DATA_FROM_THIS (GraphicsOutput);\r
322\r
323 //\r
324 // Remove the SGO interface from the system\r
325 //\r
326 Status = gBS->UninstallMultipleProtocolInterfaces (\r
327 Private->Handle,\r
328 &gEfiGraphicsOutputProtocolGuid,\r
329 &Private->GraphicsOutput,\r
330 &gEfiSimpleTextInProtocolGuid,\r
331 &Private->SimpleTextIn,\r
62cf113f 332 &gEfiSimpleTextInputExProtocolGuid,\r
333 &Private->SimpleTextInEx,\r
c9fc89a3 334 NULL\r
335 );\r
336 if (!EFI_ERROR (Status)) {\r
337 //\r
338 // Shutdown the hardware\r
339 //\r
340 Status = WinNtGopDestructor (Private);\r
341 if (EFI_ERROR (Status)) {\r
342 return EFI_DEVICE_ERROR;\r
343 }\r
344\r
345 gBS->CloseProtocol (\r
346 Handle,\r
347 &gEfiWinNtIoProtocolGuid,\r
348 This->DriverBindingHandle,\r
349 Handle\r
350 );\r
351\r
352 //\r
353 // Free our instance data\r
354 //\r
355 FreeUnicodeStringTable (Private->ControllerNameTable);\r
62cf113f 356 Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
357 ASSERT_EFI_ERROR (Status);\r
358 Status = gBS->CloseEvent (Private->SimpleTextInEx.WaitForKeyEx);\r
359 ASSERT_EFI_ERROR (Status);\r
360 FreeNotifyList (&Private->NotifyList);\r
c9fc89a3 361\r
62cf113f 362 gBS->FreePool (Private);\r
c9fc89a3 363\r
364 }\r
365\r
366 return Status;\r
367}\r
368\r