From f1aec6ccb4025a96270a25f87d212ec994793673 Mon Sep 17 00:00:00 2001 From: vanjeff Date: Wed, 25 Feb 2009 07:54:57 +0000 Subject: 1. Retired HotPlugDevice protocol. 2. Check devicepath node to get hot plug information. Currently, USB and PCCard device are checked. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7673 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/Console/ConPlatformDxe/ConPlatform.c | 113 ++++++++++++--------- .../Universal/Console/ConPlatformDxe/ConPlatform.h | 12 +-- .../Console/ConPlatformDxe/ConPlatformDxe.inf | 1 - .../Universal/Console/TerminalDxe/Terminal.c | 107 +++++++++---------- .../Universal/Console/TerminalDxe/Terminal.h | 18 +++- .../Universal/Console/TerminalDxe/TerminalDxe.inf | 1 - 6 files changed, 143 insertions(+), 109 deletions(-) (limited to 'MdeModulePkg/Universal') diff --git a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c index bc5216d..6c72c8d 100644 --- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c +++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c @@ -256,12 +256,12 @@ ConPlatformTextInDriverBindingStart ( return Status; } // - // Check the device handle, if it is a hot plug device, + // Check the device path, if it is a hot plug device, // do not put the device path into ConInDev, and install // gEfiConsoleInDeviceGuid to the device handle directly. // The policy is, make hot plug device plug in and play immediately. // - if (IsHotPlugDevice (This->DriverBindingHandle, ControllerHandle)) { + if (IsHotPlugDevice (DevicePath)) { gBS->InstallMultipleProtocolInterfaces ( &ControllerHandle, &gEfiConsoleInDeviceGuid, @@ -373,12 +373,12 @@ ConPlatformTextOutDriverBindingStart ( return Status; } // - // Check the device handle, if it is a hot plug device, + // Check the device path, if it is a hot plug device, // do not put the device path into ConOutDev and ErrOutDev, // and install gEfiConsoleOutDeviceGuid to the device handle directly. // The policy is, make hot plug device plug in and play immediately. // - if (IsHotPlugDevice (This->DriverBindingHandle, ControllerHandle)) { + if (IsHotPlugDevice (DevicePath)) { gBS->InstallMultipleProtocolInterfaces ( &ControllerHandle, &gEfiConsoleOutDeviceGuid, @@ -482,21 +482,24 @@ ConPlatformTextInDriverBindingStop ( EFI_DEVICE_PATH_PROTOCOL *DevicePath; // - // If it is not a hot-plug device, first delete it from the ConInDev variable. + // Get the Device Path Protocol firstly // - if (!IsHotPlugDevice (This->DriverBindingHandle, ControllerHandle)) { + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + (VOID **) &DevicePath, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + // + // If there is device path on ControllerHandle + // + if (!EFI_ERROR (Status)) { // - // Get the Device Path Protocol so the environment variables can be updated + // If it is not a hot-plug device, first delete it from the ConInDev variable. // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { + if (!IsHotPlugDevice (DevicePath)) { // // Remove DevicePath from ConInDev // @@ -507,6 +510,7 @@ ConPlatformTextInDriverBindingStop ( ); } } + // // Uninstall the Console Device GUIDs from Controller Handle // @@ -557,21 +561,21 @@ ConPlatformTextOutDriverBindingStop ( EFI_DEVICE_PATH_PROTOCOL *DevicePath; // - // If it is not a hot-plug device, first delete it from the ConOutDev and ErrOutDev variable. + // Get the Device Path Protocol firstly // - if (!IsHotPlugDevice (This->DriverBindingHandle, ControllerHandle)) { + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + (VOID **) &DevicePath, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (!EFI_ERROR (Status)) { // - // Get the Device Path Protocol so the environment variables can be updated + // If it is not a hot-plug device, first delete it from the ConOutDev and ErrOutDev variable. // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiDevicePathProtocolGuid, - (VOID **) &DevicePath, - This->DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { + if (!IsHotPlugDevice (DevicePath)) { // // Remove DevicePath from ConOutDev, and ErrOutDev // @@ -587,6 +591,7 @@ ConPlatformTextOutDriverBindingStop ( ); } } + // // Uninstall the Console Device GUIDs from Controller Handle // @@ -929,10 +934,12 @@ ConPlatformUpdateDeviceVariable ( } /** - Check if the device supports hot-plug. + Check if the device supports hot-plug through its device path. + + This function could be updated to check more types of Hot Plug devices. + Currently, it checks USB and PCCard device. - @param DriverBindingHandle Protocol instance pointer. - @param ControllerHandle Handle of device to check. + @param DevicePath Pointer to device's device path. @retval TRUE The devcie is a hot-plug device @retval FALSE The devcie is not a hot-plug device. @@ -940,26 +947,36 @@ ConPlatformUpdateDeviceVariable ( **/ BOOLEAN IsHotPlugDevice ( - EFI_HANDLE DriverBindingHandle, - EFI_HANDLE ControllerHandle + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath ) { - EFI_STATUS Status; + EFI_DEVICE_PATH_PROTOCOL *CheckDevicePath; - // - // HotPlugDeviceGuid indicates ControllerHandle stands for a hot plug device. - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiHotPlugDeviceGuid, - NULL, - DriverBindingHandle, - ControllerHandle, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return FALSE; + CheckDevicePath = DevicePath; + while (!IsDevicePathEnd (CheckDevicePath)) { + // + // Check device whether is hot plug device or not throught Device Path + // + if ((DevicePathType (CheckDevicePath) == MESSAGING_DEVICE_PATH) && + (DevicePathSubType (CheckDevicePath) == MSG_USB_DP || + DevicePathSubType (CheckDevicePath) == MSG_USB_CLASS_DP || + DevicePathSubType (CheckDevicePath) == MSG_USB_WWID_DP)) { + // + // If Device is USB device + // + return TRUE; + } + if ((DevicePathType (CheckDevicePath) == HARDWARE_DEVICE_PATH) && + (DevicePathSubType (CheckDevicePath) == HW_PCCARD_DP)) { + // + // If Device is PCCard + // + return TRUE; + } + + CheckDevicePath = NextDevicePathNode (CheckDevicePath); } - return TRUE; + return FALSE; } + diff --git a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h index f7883dc..a47ad1c 100644 --- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h +++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h @@ -20,7 +20,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include #include -#include #include #include @@ -293,10 +292,12 @@ ConPlatformUpdateDeviceVariable ( ); /** - Check if the device supports hot-plug. + Check if the device supports hot-plug through its device path. - @param DriverBindingHandle Protocol instance pointer. - @param ControllerHandle Handle of device to check. + This function could be updated to check more types of Hot Plug devices. + Currently, it checks USB and PCCard device. + + @param DevicePath Pointer to device's device path. @retval TRUE The devcie is a hot-plug device @retval FALSE The devcie is not a hot-plug device. @@ -304,8 +305,7 @@ ConPlatformUpdateDeviceVariable ( **/ BOOLEAN IsHotPlugDevice ( - EFI_HANDLE DriverBindingHandle, - EFI_HANDLE ControllerHandle + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath ); // diff --git a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf index a96a633..892d051 100644 --- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf +++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatformDxe.inf @@ -87,5 +87,4 @@ gEfiDevicePathProtocolGuid ## TO_START gEfiSimpleTextInProtocolGuid ## TO_START gEfiSimpleTextOutProtocolGuid ## TO_START - gEfiHotPlugDeviceGuid ## SOMETIMES_CONSUMES (Used to check if it's a hot-plug device) \ No newline at end of file diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c index 92ec98a..7cea36b 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c @@ -300,19 +300,12 @@ TerminalDriverBindingStart ( if (EFI_ERROR (Status)) { goto Error; } - // - // if the serial device is a hot plug device, do not update the - // ConInDev, ConOutDev, and StdErrDev variables. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiHotPlugDeviceGuid, - NULL, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (EFI_ERROR (Status)) { + + if (IsHotPlugDevice (ParentDevicePath)) { + // + // if the serial device is a hot plug device, do not update the + // ConInDev, ConOutDev, and StdErrDev variables. + // TerminalUpdateConsoleDevVariable (L"ConInDev", ParentDevicePath); TerminalUpdateConsoleDevVariable (L"ConOutDev", ParentDevicePath); TerminalUpdateConsoleDevVariable (L"ErrOutDev", ParentDevicePath); @@ -627,26 +620,7 @@ TerminalDriverBindingStart ( if (EFI_ERROR (Status)) { goto Error; } - // - // if the serial device is a hot plug device, attaches the HotPlugGuid - // onto the terminal device handle. - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiHotPlugDeviceGuid, - NULL, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - Status = gBS->InstallMultipleProtocolInterfaces ( - &TerminalDevice->Handle, - &gEfiHotPlugDeviceGuid, - NULL, - NULL - ); - } + // // Register the Parent-Child relationship via // EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER. @@ -886,25 +860,6 @@ TerminalDriverBindingStop ( FreeUnicodeStringTable (TerminalDevice->ControllerNameTable); } - Status = gBS->OpenProtocol ( - ChildHandleBuffer[Index], - &gEfiHotPlugDeviceGuid, - NULL, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_TEST_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - Status = gBS->UninstallMultipleProtocolInterfaces ( - ChildHandleBuffer[Index], - &gEfiHotPlugDeviceGuid, - NULL, - NULL - ); - } else { - Status = EFI_SUCCESS; - } - gBS->CloseEvent (TerminalDevice->TwoSecondTimeOut); gBS->CloseEvent (TerminalDevice->SimpleInput.WaitForKey); gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx); @@ -1322,3 +1277,51 @@ InitializeTerminal( return Status; } + +/** + Check if the device supports hot-plug through its device path. + + This function could be updated to check more types of Hot Plug devices. + Currently, it checks USB and PCCard device. + + @param DevicePath Pointer to device's device path. + + @retval TRUE The devcie is a hot-plug device + @retval FALSE The devcie is not a hot-plug device. + +**/ +BOOLEAN +IsHotPlugDevice ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ) +{ + EFI_DEVICE_PATH_PROTOCOL *CheckDevicePath; + + CheckDevicePath = DevicePath; + while (!IsDevicePathEnd (CheckDevicePath)) { + // + // Check device whether is hot plug device or not throught Device Path + // + if ((DevicePathType (CheckDevicePath) == MESSAGING_DEVICE_PATH) && + (DevicePathSubType (CheckDevicePath) == MSG_USB_DP || + DevicePathSubType (CheckDevicePath) == MSG_USB_CLASS_DP || + DevicePathSubType (CheckDevicePath) == MSG_USB_WWID_DP)) { + // + // If Device is USB device + // + return TRUE; + } + if ((DevicePathType (CheckDevicePath) == HARDWARE_DEVICE_PATH) && + (DevicePathSubType (CheckDevicePath) == HW_PCCARD_DP)) { + // + // If Device is PCCard + // + return TRUE; + } + + CheckDevicePath = NextDevicePathNode (CheckDevicePath); + } + + return FALSE; +} + diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h index e55343c..2f99060 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h +++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h @@ -21,7 +21,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include #include -#include #include #include #include @@ -1346,4 +1345,21 @@ TerminalIsValidEfiCntlChar ( IN CHAR16 CharC ); +/** + Check if the device supports hot-plug through its device path. + + This function could be updated to check more types of Hot Plug devices. + Currently, it checks USB and PCCard device. + + @param DevicePath Pointer to device's device path. + + @retval TRUE The devcie is a hot-plug device + @retval FALSE The devcie is not a hot-plug device. + +**/ +BOOLEAN +IsHotPlugDevice ( + IN EFI_DEVICE_PATH_PROTOCOL *DevicePath + ); + #endif diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf index 112b19e..26ee19b 100644 --- a/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf +++ b/MdeModulePkg/Universal/Console/TerminalDxe/TerminalDxe.inf @@ -72,7 +72,6 @@ gEfiSimpleTextInProtocolGuid ## BY_START gEfiSimpleTextInputExProtocolGuid ## BY_START gEfiSimpleTextOutProtocolGuid ## BY_START - gEfiHotPlugDeviceGuid ## SOMETIMES_CONSUMES [Pcd] gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueRemoteConsoleError -- cgit v1.1