// Perform a read to cleanup the Status Register's\r
// output buffer full bits within MAX TRY times\r
//\r
- while (!EFI_ERROR (Status) && TryTime < KEYBOARD_MAX_TRY) {\r
- Status = KeyboardRead (ConsoleIn, &CommandByte);\r
- TryTime ++;\r
- }\r
- //\r
- // Exceed the max try times. The device may be error.\r
- //\r
- if (TryTime == KEYBOARD_MAX_TRY) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Done;\r
+ if ((KeyReadStatusRegister (ConsoleIn) & KEYBOARD_STATUS_REGISTER_HAS_OUTPUT_DATA)) {\r
+ while (!EFI_ERROR (Status) && TryTime < KEYBOARD_MAX_TRY) {\r
+ Status = KeyboardRead (ConsoleIn, &CommandByte);\r
+ TryTime ++;\r
+ }\r
+ //\r
+ // Exceed the max try times. The device may be error.\r
+ //\r
+ if (TryTime == KEYBOARD_MAX_TRY) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Done;\r
+ }\r
}\r
//\r
// We should disable mouse interface during the initialization process\r
// time initialization\r
//\r
if ((KeyReadStatusRegister (ConsoleIn) & KEYBOARD_STATUS_REGISTER_SYSTEM_FLAG) != 0) {\r
- //\r
- // 8042 controller is already setup (by myself or by mouse driver):\r
- // See whether mouse interface is already enabled\r
- // which determines whether we should enable it later\r
- //\r
- //\r
- // Read the command byte of 8042 controller\r
- //\r
- Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_READ);\r
- if (EFI_ERROR (Status)) {\r
- KeyboardError (ConsoleIn, L"\n\r");\r
- goto Done;\r
- }\r
-\r
- Status = KeyboardRead (ConsoleIn, &CommandByte);\r
- if (EFI_ERROR (Status)) {\r
- KeyboardError (ConsoleIn, L"\n\r");\r
- goto Done;\r
- }\r
- //\r
- // Test the mouse enabling bit\r
- //\r
- if ((CommandByte & 0x20) != 0) {\r
- mEnableMouseInterface = FALSE;\r
+ if (!PcdGetBool (PcdFastPS2Detection)) {\r
+ //\r
+ // 8042 controller is already setup (by myself or by mouse driver):\r
+ // See whether mouse interface is already enabled\r
+ // which determines whether we should enable it later\r
+ //\r
+ //\r
+ // Read the command byte of 8042 controller\r
+ //\r
+ Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_READ);\r
+ if (EFI_ERROR (Status)) {\r
+ KeyboardError (ConsoleIn, L"\n\r");\r
+ goto Done;\r
+ }\r
+ \r
+ Status = KeyboardRead (ConsoleIn, &CommandByte);\r
+ if (EFI_ERROR (Status)) {\r
+ KeyboardError (ConsoleIn, L"\n\r");\r
+ goto Done;\r
+ }\r
+ //\r
+ // Test the mouse enabling bit\r
+ //\r
+ if ((CommandByte & 0x20) != 0) {\r
+ mEnableMouseInterface = FALSE;\r
+ } else {\r
+ mEnableMouseInterface = TRUE;\r
+ }\r
} else {\r
- mEnableMouseInterface = TRUE;\r
- }\r
-\r
+ mEnableMouseInterface = FALSE;\r
+ } \r
} else {\r
//\r
// 8042 controller is not setup yet:\r
//\r
// Disable keyboard and mouse interfaces\r
//\r
- Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_DISABLE_KEYBOARD_INTERFACE);\r
- if (EFI_ERROR (Status)) {\r
- KeyboardError (ConsoleIn, L"\n\r");\r
- goto Done;\r
- }\r
-\r
- Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_DISABLE_MOUSE_INTERFACE);\r
- if (EFI_ERROR (Status)) {\r
- KeyboardError (ConsoleIn, L"\n\r");\r
- goto Done;\r
- }\r
-\r
- REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
- EFI_PROGRESS_CODE,\r
- EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_SELF_TEST,\r
- ConsoleIn->DevicePath\r
- );\r
- //\r
- // 8042 Controller Self Test\r
- //\r
- Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_CONTROLLER_SELF_TEST);\r
- if (EFI_ERROR (Status)) {\r
- KeyboardError (ConsoleIn, L"8042 controller command write error!\n\r");\r
- goto Done;\r
- }\r
-\r
- Status = KeyboardWaitForValue (ConsoleIn, 0x55);\r
- if (EFI_ERROR (Status)) {\r
- KeyboardError (ConsoleIn, L"8042 controller self test failed!\n\r");\r
- goto Done;\r
+ if (!PcdGetBool (PcdFastPS2Detection)) {\r
+ Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_DISABLE_KEYBOARD_INTERFACE);\r
+ if (EFI_ERROR (Status)) {\r
+ KeyboardError (ConsoleIn, L"\n\r");\r
+ goto Done;\r
+ }\r
+ \r
+ Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_DISABLE_MOUSE_INTERFACE);\r
+ if (EFI_ERROR (Status)) {\r
+ KeyboardError (ConsoleIn, L"\n\r");\r
+ goto Done;\r
+ }\r
+ \r
+ REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
+ EFI_PROGRESS_CODE,\r
+ EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_SELF_TEST,\r
+ ConsoleIn->DevicePath\r
+ );\r
+ //\r
+ // 8042 Controller Self Test\r
+ //\r
+ Status = KeyboardCommand (ConsoleIn, KEYBOARD_8042_COMMAND_CONTROLLER_SELF_TEST);\r
+ if (EFI_ERROR (Status)) {\r
+ KeyboardError (ConsoleIn, L"8042 controller command write error!\n\r");\r
+ goto Done;\r
+ }\r
+ \r
+ Status = KeyboardWaitForValue (ConsoleIn, 0x55);\r
+ if (EFI_ERROR (Status)) {\r
+ KeyboardError (ConsoleIn, L"8042 controller self test failed!\n\r");\r
+ goto Done;\r
+ }\r
}\r
//\r
// Don't enable mouse interface later\r
EFI_STATUS Status;\r
UINTN WaitForValueTimeOutBcakup;\r
\r
- Status = EFI_SUCCESS;\r
//\r
// enable keyboard itself and wait for its ack\r
// If can't receive ack, Keyboard should not be connected.\r
//\r
- Status = KeyboardWrite (\r
- ConsoleIn,\r
- KEYBOARD_KBEN\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
- }\r
- //\r
- // wait for 1s\r
- //\r
- WaitForValueTimeOutBcakup = mWaitForValueTimeOut;\r
- mWaitForValueTimeOut = KEYBOARD_WAITFORVALUE_TIMEOUT;\r
- Status = KeyboardWaitForValue (\r
- ConsoleIn,\r
- KEYBOARD_CMDECHO_ACK\r
- );\r
- mWaitForValueTimeOut = WaitForValueTimeOutBcakup;\r
-\r
- if (EFI_ERROR (Status)) {\r
- return FALSE;\r
+ if (!PcdGetBool (PcdFastPS2Detection)) {\r
+ Status = KeyboardWrite (\r
+ ConsoleIn,\r
+ KEYBOARD_KBEN\r
+ );\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+ //\r
+ // wait for 1s\r
+ //\r
+ WaitForValueTimeOutBcakup = mWaitForValueTimeOut;\r
+ mWaitForValueTimeOut = KEYBOARD_WAITFORVALUE_TIMEOUT;\r
+ Status = KeyboardWaitForValue (\r
+ ConsoleIn,\r
+ KEYBOARD_CMDECHO_ACK\r
+ );\r
+ mWaitForValueTimeOut = WaitForValueTimeOutBcakup;\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ return FALSE;\r
+ }\r
+ \r
+ return TRUE;\r
+ } else {\r
+ return TRUE;\r
}\r
-\r
- return TRUE;\r
}\r
\r
//\r
// Return code is ignored on purpose.\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
+ 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
[FeaturePcd]\r
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification\r
\r
+[Pcd]\r
+ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdFastPS2Detection\r
+\r
# [Event]\r
# ##\r
# # Event will be signaled for WaitForKey event.\r
// if not skip step 4&5 and jump to step 6 to selftest KBC and report this\r
// else go step 4\r
//\r
- if ((KeyReadStatusRegister (BiosKeyboardPrivate) & KBC_STSREG_VIA64_SYSF) != 0) {\r
- //\r
- // 4\r
- // CheckMouseStatus to decide enable it later or not\r
- //\r
- //\r
- // Read the command byte of KBC\r
- //\r
- Status = KeyboardCommand (\r
- BiosKeyboardPrivate,\r
- KBC_CMDREG_VIA64_CMDBYTE_R\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
- }\r
-\r
- Status = KeyboardRead (\r
- BiosKeyboardPrivate,\r
- &CommandByte\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
- }\r
- //\r
- // Check mouse enabled or not before\r
- //\r
- if ((CommandByte & KB_CMMBYTE_DISABLE_AUX) != 0) {\r
- MouseEnable = FALSE;\r
+ if (!PcdGetBool (PcdFastPS2Detection)) {\r
+ if ((KeyReadStatusRegister (BiosKeyboardPrivate) & KBC_STSREG_VIA64_SYSF) != 0) {\r
+ //\r
+ // 4\r
+ // CheckMouseStatus to decide enable it later or not\r
+ //\r
+ //\r
+ // Read the command byte of KBC\r
+ //\r
+ Status = KeyboardCommand (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDREG_VIA64_CMDBYTE_R\r
+ );\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
+ \r
+ Status = KeyboardRead (\r
+ BiosKeyboardPrivate,\r
+ &CommandByte\r
+ );\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
+ //\r
+ // Check mouse enabled or not before\r
+ //\r
+ if ((CommandByte & KB_CMMBYTE_DISABLE_AUX) != 0) {\r
+ MouseEnable = FALSE;\r
+ } else {\r
+ MouseEnable = TRUE;\r
+ }\r
+ //\r
+ // 5\r
+ // disable mouse (via KBC) and Keyborad device\r
+ //\r
+ Status = KeyboardCommand (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDREG_VIA64_AUX_DISABLE\r
+ );\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
+ \r
+ Status = KeyboardCommand (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDREG_VIA64_KB_DISABLE\r
+ );\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
} else {\r
- MouseEnable = TRUE;\r
- }\r
- //\r
- // 5\r
- // disable mouse (via KBC) and Keyborad device\r
- //\r
- Status = KeyboardCommand (\r
- BiosKeyboardPrivate,\r
- KBC_CMDREG_VIA64_AUX_DISABLE\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
- }\r
-\r
- Status = KeyboardCommand (\r
- BiosKeyboardPrivate,\r
- KBC_CMDREG_VIA64_KB_DISABLE\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
- }\r
-\r
- } else {\r
- //\r
- // 6\r
- // KBC Self Test\r
- //\r
- //\r
- // Report a Progress Code for performing a self test on the keyboard controller\r
- //\r
- REPORT_STATUS_CODE (\r
- EFI_PROGRESS_CODE,\r
- EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_SELF_TEST\r
- );\r
-\r
- Status = KeyboardCommand (\r
- BiosKeyboardPrivate,\r
- KBC_CMDREG_VIA64_KBC_SLFTEST\r
- );\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
- }\r
-\r
- Status = KeyboardWaitForValue (\r
- BiosKeyboardPrivate,\r
- KBC_CMDECHO_KBCSLFTEST_OK,\r
- KEYBOARD_WAITFORVALUE_TIMEOUT\r
- );\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
+ //\r
+ // 6\r
+ // KBC Self Test\r
+ //\r
+ //\r
+ // Report a Progress Code for performing a self test on the keyboard controller\r
+ // \r
+ REPORT_STATUS_CODE (\r
+ EFI_PROGRESS_CODE,\r
+ EFI_PERIPHERAL_KEYBOARD | EFI_P_KEYBOARD_PC_SELF_TEST\r
+ );\r
+ \r
+ Status = KeyboardCommand (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDREG_VIA64_KBC_SLFTEST\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
+ \r
+ Status = KeyboardWaitForValue (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDECHO_KBCSLFTEST_OK,\r
+ KEYBOARD_WAITFORVALUE_TIMEOUT\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
}\r
}\r
//\r
// Done for validating keyboard. Enable keyboard (via KBC)\r
// and recover the command byte to proper value\r
//\r
- Status = KeyboardCommand (\r
- BiosKeyboardPrivate,\r
- KBC_CMDREG_VIA64_KB_ENABLE\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- Status = EFI_DEVICE_ERROR;\r
- goto Exit;\r
+ if (!PcdGetBool (PcdFastPS2Detection)) {\r
+ Status = KeyboardCommand (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDREG_VIA64_KB_ENABLE\r
+ );\r
+ \r
+ if (EFI_ERROR (Status)) {\r
+ Status = EFI_DEVICE_ERROR;\r
+ goto Exit;\r
+ }\r
}\r
\r
//\r
// enable keyboard itself and wait for its ack\r
// If can't receive ack, Keyboard should not be connected.\r
//\r
- Status = KeyboardWrite (\r
- BiosKeyboardPrivate,\r
- KBC_INPBUF_VIA60_KBEN\r
- );\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "[KBD]CheckKeyboardConnect - Keyboard enable failed!\n"));\r
- REPORT_STATUS_CODE (\r
- EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
- EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR\r
- );\r
- return FALSE;\r
- }\r
+ if (!PcdGetBool (PcdFastPS2Detection)) {\r
+ Status = KeyboardWrite (\r
+ BiosKeyboardPrivate,\r
+ KBC_INPBUF_VIA60_KBEN\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "[KBD]CheckKeyboardConnect - Keyboard enable failed!\n"));\r
+ REPORT_STATUS_CODE (\r
+ EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
+ EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR\r
+ );\r
+ return FALSE;\r
+ }\r
\r
- Status = KeyboardWaitForValue (\r
- BiosKeyboardPrivate,\r
- KBC_CMDECHO_ACK,\r
- KEYBOARD_WAITFORVALUE_TIMEOUT\r
- );\r
+ Status = KeyboardWaitForValue (\r
+ BiosKeyboardPrivate,\r
+ KBC_CMDECHO_ACK,\r
+ KEYBOARD_WAITFORVALUE_TIMEOUT\r
+ );\r
\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_ERROR, "[KBD]CheckKeyboardConnect - Timeout!\n"));\r
- REPORT_STATUS_CODE (\r
- EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
- EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR\r
- );\r
- return FALSE;\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "[KBD]CheckKeyboardConnect - Timeout!\n"));\r
+ REPORT_STATUS_CODE (\r
+ EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
+ EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR\r
+ );\r
+ return FALSE;\r
+ }\r
+ return TRUE;\r
+ } else {\r
+ return TRUE;\r
}\r
-\r
- return TRUE;\r
}\r
\r
/**\r
gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED\r
\r
[FeaturePcd]\r
- gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE
\ No newline at end of file
+ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdPs2KbdExtendedVerification|FALSE\r
+\r
+[Pcd]\r
+ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdFastPS2Detection
\ No newline at end of file
## The PCD is used to specify the high PMM (Post Memory Manager) size with bytes above 1MB.\r
# The value should be a multiple of 4KB.\r
gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdHighPmmMemorySize|0x400000|UINT32|0x3000000a\r
-
\ No newline at end of file
+\r
+ ## This PCD specifies whether to use the optimized timing for best PS2 detection performance.\r
+ # Note this PCD could be set to TRUE for best boot performance and set to FALSE for best device compatibility.\r
+ gEfiIntelFrameworkModulePkgTokenSpaceGuid.PcdFastPS2Detection|FALSE|BOOLEAN|0x3000000b
\ No newline at end of file