]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.c
IntelFrameworkModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2KeyboardDxe / Ps2Keyboard.c
index 25aadfe481c38c5a3c78c89d3bfd51f786e32539..2dcb17ff3981491339befef1f4ec0ab259f35495 100644 (file)
@@ -3,14 +3,8 @@
   PS/2 Keyboard driver. Routines that interacts with callers,\r
   conforming to EFI driver model\r
 \r
-Copyright (c) 2006 - 2009, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -21,11 +15,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 //\r
 /**\r
   Test controller is a keyboard Controller.\r
-  \r
+\r
   @param This                 Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
   @param Controller           driver's controller\r
   @param RemainingDevicePath  children device path\r
-  \r
+\r
   @retval EFI_UNSUPPORTED controller is not floppy disk\r
   @retval EFI_SUCCESS     controller is floppy disk\r
 **/\r
@@ -39,11 +33,11 @@ KbdControllerDriverSupported (
 \r
 /**\r
   Create KEYBOARD_CONSOLE_IN_DEV instance on controller.\r
-  \r
+\r
   @param This         Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
   @param Controller   driver controller handle\r
   @param RemainingDevicePath Children's device path\r
-  \r
+\r
   @retval whether success to create floppy control instance.\r
 **/\r
 EFI_STATUS\r
@@ -55,7 +49,7 @@ KbdControllerDriverStart (
   );\r
 \r
 /**\r
-  Stop this driver on ControllerHandle. Support stoping any child handles\r
+  Stop this driver on ControllerHandle. Support stopping any child handles\r
   created by this driver.\r
 \r
   @param  This              Protocol instance pointer.\r
@@ -79,16 +73,16 @@ KbdControllerDriverStop (
 \r
 /**\r
   Free the waiting key notify list.\r
-  \r
+\r
   @param ListHead  Pointer to list head\r
-  \r
+\r
   @retval EFI_INVALID_PARAMETER  ListHead is NULL\r
   @retval EFI_SUCCESS            Sucess to free NotifyList\r
 **/\r
 EFI_STATUS\r
 KbdFreeNotifyList (\r
   IN OUT LIST_ENTRY           *ListHead\r
-  );  \r
+  );\r
 \r
 //\r
 // DriverBinding Protocol Instance\r
@@ -104,11 +98,11 @@ EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {
 \r
 /**\r
   Test controller is a keyboard Controller.\r
-  \r
+\r
   @param This                 Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
   @param Controller           driver's controller\r
   @param RemainingDevicePath  children device path\r
-  \r
+\r
   @retval EFI_UNSUPPORTED controller is not floppy disk\r
   @retval EFI_SUCCESS     controller is floppy disk\r
 **/\r
@@ -158,11 +152,11 @@ KbdControllerDriverSupported (
 \r
 /**\r
   Create KEYBOARD_CONSOLE_IN_DEV instance on controller.\r
-  \r
+\r
   @param This         Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
   @param Controller   driver controller handle\r
   @param RemainingDevicePath Children's device path\r
-  \r
+\r
   @retval whether success to create floppy control instance.\r
 **/\r
 EFI_STATUS\r
@@ -243,35 +237,39 @@ KbdControllerDriverStart (
   ConsoleIn->StatusRegisterAddress  = KEYBOARD_8042_STATUS_REGISTER;\r
   ConsoleIn->CommandRegisterAddress = KEYBOARD_8042_COMMAND_REGISTER;\r
   ConsoleIn->IsaIo                  = IsaIo;\r
-  ConsoleIn->ScancodeBufStartPos    = 0;\r
-  ConsoleIn->ScancodeBufEndPos      = KEYBOARD_BUFFER_MAX_COUNT - 1;\r
-  ConsoleIn->ScancodeBufCount       = 0;\r
-  ConsoleIn->Ctrled                 = FALSE;\r
-  ConsoleIn->Alted                  = FALSE;\r
   ConsoleIn->DevicePath             = ParentDevicePath;\r
 \r
   ConsoleIn->ConInEx.Reset               = KeyboardEfiResetEx;\r
   ConsoleIn->ConInEx.ReadKeyStrokeEx     = KeyboardReadKeyStrokeEx;\r
   ConsoleIn->ConInEx.SetState            = KeyboardSetState;\r
   ConsoleIn->ConInEx.RegisterKeyNotify   = KeyboardRegisterKeyNotify;\r
-  ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify;  \r
-  \r
+  ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify;\r
+\r
   InitializeListHead (&ConsoleIn->NotifyList);\r
 \r
   //\r
   // Fix for random hangs in System waiting for the Key if no KBC is present in BIOS.\r
+  // When KBC decode (IO port 0x60/0x64 decode) is not enabled,\r
+  // KeyboardRead will read back as 0xFF and return status is EFI_SUCCESS.\r
+  // So instead we read status register to detect after read if KBC decode is enabled.\r
   //\r
-  KeyboardRead (ConsoleIn, &Data);\r
-  if ((KeyReadStatusRegister (ConsoleIn) & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {\r
-    //\r
-    // If nobody decodes KBC I/O port, it will read back as 0xFF.\r
-    // Check the Time-Out and Parity bit to see if it has an active KBC in system\r
-    //\r
-    Status      = EFI_DEVICE_ERROR;\r
-    StatusCode  = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
-    goto ErrorExit;\r
+\r
+  //\r
+  // Return code is ignored on purpose.\r
+  //\r
+  if (!PcdGetBool (PcdFastPS2Detection)) {\r
+    KeyboardRead (ConsoleIn, &Data);\r
+    if ((KeyReadStatusRegister (ConsoleIn) & (KBC_PARE | KBC_TIM)) == (KBC_PARE | KBC_TIM)) {\r
+      //\r
+      // If nobody decodes KBC I/O port, it will read back as 0xFF.\r
+      // Check the Time-Out and Parity bit to see if it has an active KBC in system\r
+      //\r
+      Status      = EFI_DEVICE_ERROR;\r
+      StatusCode  = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
+      goto ErrorExit;\r
+    }\r
   }\r
-  \r
+\r
   //\r
   // Setup the WaitForKey event\r
   //\r
@@ -279,7 +277,7 @@ KbdControllerDriverStart (
                   EVT_NOTIFY_WAIT,\r
                   TPL_NOTIFY,\r
                   KeyboardWaitForKey,\r
-                  &(ConsoleIn->ConIn),\r
+                  ConsoleIn,\r
                   &((ConsoleIn->ConIn).WaitForKey)\r
                   );\r
   if (EFI_ERROR (Status)) {\r
@@ -289,12 +287,12 @@ KbdControllerDriverStart (
   }\r
   //\r
   // Setup the WaitForKeyEx event\r
-  //  \r
+  //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_WAIT,\r
                   TPL_NOTIFY,\r
                   KeyboardWaitForKeyEx,\r
-                  &(ConsoleIn->ConInEx),\r
+                  ConsoleIn,\r
                   &(ConsoleIn->ConInEx.WaitForKeyEx)\r
                   );\r
   if (EFI_ERROR (Status)) {\r
@@ -302,6 +300,7 @@ KbdControllerDriverStart (
     StatusCode  = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
     goto ErrorExit;\r
   }\r
+\r
   // Setup a periodic timer, used for reading keystrokes at a fixed interval\r
   //\r
   Status = gBS->CreateEvent (\r
@@ -328,6 +327,19 @@ KbdControllerDriverStart (
     goto ErrorExit;\r
   }\r
 \r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  KeyNotifyProcessHandler,\r
+                  ConsoleIn,\r
+                  &ConsoleIn->KeyNotifyProcessEvent\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    Status      = EFI_OUT_OF_RESOURCES;\r
+    StatusCode  = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
+    goto ErrorExit;\r
+  }\r
+\r
   REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
     EFI_PROGRESS_CODE,\r
     EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT,\r
@@ -337,13 +349,19 @@ KbdControllerDriverStart (
   //\r
   // Reset the keyboard device\r
   //\r
-  Status = ConsoleIn->ConIn.Reset (&ConsoleIn->ConIn, TRUE);\r
+  Status = ConsoleIn->ConInEx.Reset (&ConsoleIn->ConInEx, FeaturePcdGet (PcdPs2KbdExtendedVerification));\r
   if (EFI_ERROR (Status)) {\r
     Status      = EFI_DEVICE_ERROR;\r
     StatusCode  = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
     goto ErrorExit;\r
   }\r
 \r
+  REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
+    EFI_PROGRESS_CODE,\r
+    EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DETECTED,\r
+    ParentDevicePath\r
+    );\r
+\r
   ConsoleIn->ControllerNameTable = NULL;\r
   AddUnicodeString2 (\r
     "eng",\r
@@ -401,6 +419,9 @@ ErrorExit:
   if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {\r
     gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
   }\r
+  if ((ConsoleIn != NULL) && (ConsoleIn->KeyNotifyProcessEvent != NULL)) {\r
+    gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);\r
+  }\r
   KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
   if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {\r
     FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
@@ -415,7 +436,7 @@ ErrorExit:
       Status1 = KeyboardRead (ConsoleIn, &Data);;\r
     }\r
   }\r
-  \r
+\r
   if (ConsoleIn != NULL) {\r
     gBS->FreePool (ConsoleIn);\r
   }\r
@@ -438,7 +459,7 @@ ErrorExit:
 }\r
 \r
 /**\r
-  Stop this driver on ControllerHandle. Support stoping any child handles\r
+  Stop this driver on ControllerHandle. Support stopping any child handles\r
   created by this driver.\r
 \r
   @param  This              Protocol instance pointer.\r
@@ -490,7 +511,7 @@ KbdControllerDriverStop (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
-  \r
+\r
   ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (ConIn);\r
 \r
   //\r
@@ -506,10 +527,6 @@ KbdControllerDriverStop (
     gBS->CloseEvent (ConsoleIn->TimerEvent);\r
     ConsoleIn->TimerEvent = NULL;\r
   }\r
-  //\r
-  // Disable the keyboard interface\r
-  //\r
-  Status = DisableKeyboard (ConsoleIn);\r
 \r
   //\r
   // Since there will be no timer handler for keyboard input any more,\r
@@ -551,7 +568,7 @@ KbdControllerDriverStop (
   //\r
   // Free other resources\r
   //\r
-  if ((ConsoleIn->ConIn).WaitForKey) {\r
+  if ((ConsoleIn->ConIn).WaitForKey != NULL) {\r
     gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);\r
     (ConsoleIn->ConIn).WaitForKey = NULL;\r
   }\r
@@ -559,6 +576,10 @@ KbdControllerDriverStop (
     gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
     ConsoleIn->ConInEx.WaitForKeyEx = NULL;\r
   }\r
+  if (ConsoleIn->KeyNotifyProcessEvent != NULL) {\r
+    gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);\r
+    ConsoleIn->KeyNotifyProcessEvent = NULL;\r
+  }\r
   KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
   FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
   gBS->FreePool (ConsoleIn);\r
@@ -568,9 +589,9 @@ KbdControllerDriverStop (
 \r
 /**\r
   Free the waiting key notify list.\r
-  \r
+\r
   @param ListHead  Pointer to list head\r
-  \r
+\r
   @retval EFI_INVALID_PARAMETER  ListHead is NULL\r
   @retval EFI_SUCCESS            Sucess to free NotifyList\r
 **/\r
@@ -586,24 +607,24 @@ KbdFreeNotifyList (
   }\r
   while (!IsListEmpty (ListHead)) {\r
     NotifyNode = CR (\r
-                   ListHead->ForwardLink, \r
-                   KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
-                   NotifyEntry, \r
+                   ListHead->ForwardLink,\r
+                   KEYBOARD_CONSOLE_IN_EX_NOTIFY,\r
+                   NotifyEntry,\r
                    KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
                    );\r
     RemoveEntryList (ListHead->ForwardLink);\r
     gBS->FreePool (NotifyNode);\r
   }\r
-  \r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
-  The module Entry Point for module Ps2Keyboard. \r
+  The module Entry Point for module Ps2Keyboard.\r
 \r
-  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  \r
+  @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
   @param[in] SystemTable    A pointer to the EFI System Table.\r
-  \r
+\r
   @retval EFI_SUCCESS       The entry point is executed successfully.\r
   @retval other             Some error occurs when executing this entry point.\r
 \r