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