From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.31; helo=mga06.intel.com; envelope-from=ruiyu.ni@intel.com; receiver=edk2-devel@lists.01.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id AD0F720957AEA for ; Wed, 2 May 2018 00:50:42 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 02 May 2018 00:50:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.49,354,1520924400"; d="scan'208";a="52495372" Received: from fmsmsx104.amr.corp.intel.com ([10.18.124.202]) by orsmga001.jf.intel.com with ESMTP; 02 May 2018 00:50:41 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by fmsmsx104.amr.corp.intel.com (10.18.124.202) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 2 May 2018 00:50:40 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.240]) by shsmsx102.ccr.corp.intel.com ([169.254.2.79]) with mapi id 14.03.0319.002; Wed, 2 May 2018 15:50:38 +0800 From: "Ni, Ruiyu" To: "Zeng, Star" , "edk2-devel@lists.01.org" CC: "Wu, Hao A" , "Kinney, Michael D" Thread-Topic: [PATCH] MdeModulePkg/ConPlatform: Support short-form USB device path Thread-Index: AQHT3Fh7vYhNcspKa06ZC23GsRfylaQSnI8ggAl5kAA= Date: Wed, 2 May 2018 07:50:38 +0000 Message-ID: <734D49CCEBEEF84792F5B80ED585239D5BC84FC7@SHSMSX104.ccr.corp.intel.com> References: <20180425054415.26028-1-ruiyu.ni@intel.com> <0C09AFA07DD0434D9E2A0C6AEB0483103BAE4192@shsmsx102.ccr.corp.intel.com> In-Reply-To: <0C09AFA07DD0434D9E2A0C6AEB0483103BAE4192@shsmsx102.ccr.corp.intel.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH] MdeModulePkg/ConPlatform: Support short-form USB device path X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 02 May 2018 07:50:42 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Thanks/Ray > -----Original Message----- > From: Zeng, Star > Sent: Thursday, April 26, 2018 3:05 PM > To: Ni, Ruiyu ; edk2-devel@lists.01.org > Cc: Wu, Hao A ; Kinney, Michael D > ; Zeng, Star > Subject: RE: [PATCH] MdeModulePkg/ConPlatform: Support short-form USB > device path >=20 > Ray, >=20 > Some minor comments below. >=20 > 1. How MSG_USB_DP and HW_PCCARD_DP be handled? We see they are > checked in original IsHotPlugDevice()? Original implementation to always accept USB/PCCARD device as active consol= e is wrong. So these code is just removed. >=20 > 2. gEfiUsbIoProtocolGuid needs be stated in ConPlatformDxe.inf? Thanks. I will fix it. >=20 > 3. The comment " If it is not a hot-plug device, append the device path t= o " in > ConPlatformTextInDriverBindingStart()/ConPlatformTextOutDriverBindingSt > art() needs be updated accordingly since IsHotPlugDevice() will be remove= d? Thanks. I will fix it in v2 patch. >=20 >=20 > Thanks, > Star > -----Original Message----- > From: Ni, Ruiyu > Sent: Wednesday, April 25, 2018 1:44 PM > To: edk2-devel@lists.01.org > Cc: Wu, Hao A ; Kinney, Michael D > ; Zeng, Star > Subject: [PATCH] MdeModulePkg/ConPlatform: Support short-form USB > device path >=20 > Today's implementation does an exact device path match to check > whether the device path of a console is in ConIn/ConOut/ErrOut. > But that doesn't work for the USB keyboard. > Because when a platform have multiple USB port, ConIn needs to > carry all device paths corresponding to each port. > Even worse, today's BDS core logic removes the device path from > ConIn/ConOut/ErrOut when the connection to that device path fails. > So if user switches the USB keyboard from one port to another across > boot, the USB keyboard doesn't work in the second boot. >=20 > ConPlatform driver solved this problem by adding the > IsHotPlugDevice() function. So that for USB keyboard, ConPlatform > doesn't care whether its device path is in ConIn or not. > But the rule is too loose, and now causes platform BDS cannot control > whether to enable USB keyboard as an active console. >=20 > The patch changes ConPlatform to support USB short-form device path > when checking whether the device path of a console is in > ConIn/ConOut/ErrOut. >=20 > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ruiyu Ni > Cc: Hao A Wu > Cc: Michael D Kinney > Cc: Star Zeng > --- > .../Universal/Console/ConPlatformDxe/ConPlatform.c | 526 > ++++++++++++++------- > .../Universal/Console/ConPlatformDxe/ConPlatform.h | 20 +- > 2 files changed, 353 insertions(+), 193 deletions(-) >=20 > diff --git > a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c > b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c > index 6b53e8ac74..a509d0e3a5 100644 > --- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c > +++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.c > @@ -2,7 +2,7 @@ > Console Platform DXE Driver, install Console Device Guids and update > Console > Environment Variables. >=20 > -Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
> +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BS= D > License > which accompanies this distribution. The full text of the license may b= e > found at > @@ -270,58 +270,33 @@ ConPlatformTextInDriverBindingStart ( > } >=20 > // > - // 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 it is not a hot-plug device, append the device path to the > + // ConInDev environment variable > // > - if (IsHotPlugDevice (DevicePath)) { > + ConPlatformUpdateDeviceVariable ( > + L"ConInDev", > + DevicePath, > + Append > + ); > + > + // > + // If the device path is an instance in the ConIn environment variable= , > + // then install EfiConsoleInDeviceGuid onto ControllerHandle > + // > + if (IsInConInVariable) { > gBS->InstallMultipleProtocolInterfaces ( > &ControllerHandle, > &gEfiConsoleInDeviceGuid, > NULL, > NULL > ); > - // > - // Append the device path to ConInDev only if it is in ConIn variabl= e. > - // > - if (IsInConInVariable) { > - ConPlatformUpdateDeviceVariable ( > - L"ConInDev", > - DevicePath, > - Append > - ); > - } > } else { > - // > - // If it is not a hot-plug device, append the device path to the > - // ConInDev environment variable > - // > - ConPlatformUpdateDeviceVariable ( > - L"ConInDev", > - DevicePath, > - Append > - ); > - > - // > - // If the device path is an instance in the ConIn environment variab= le, > - // then install EfiConsoleInDeviceGuid onto ControllerHandle > - // > - if (IsInConInVariable) { > - gBS->InstallMultipleProtocolInterfaces ( > - &ControllerHandle, > - &gEfiConsoleInDeviceGuid, > - NULL, > - NULL > - ); > - } else { > - gBS->CloseProtocol ( > - ControllerHandle, > - &gEfiSimpleTextInProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - } > + gBS->CloseProtocol ( > + ControllerHandle, > + &gEfiSimpleTextInProtocolGuid, > + This->DriverBindingHandle, > + ControllerHandle > + ); > } >=20 > return EFI_SUCCESS; > @@ -416,95 +391,60 @@ ConPlatformTextOutDriverBindingStart ( > } >=20 > // > - // 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 it is not a hot-plug device, append the device path to > + // the ConOutDev and ErrOutDev environment variable. > + // For GOP device path, append the sibling device path as well. > + // > + if (!ConPlatformUpdateGopCandidate (DevicePath)) { > + ConPlatformUpdateDeviceVariable ( > + L"ConOutDev", > + DevicePath, > + Append > + ); > + // > + // Then append the device path to the ErrOutDev environment variable > + // > + ConPlatformUpdateDeviceVariable ( > + L"ErrOutDev", > + DevicePath, > + Append > + ); > + } > + > + // > + // If the device path is an instance in the ConOut environment variabl= e, > + // then install EfiConsoleOutDeviceGuid onto ControllerHandle > + // > + if (IsInConOutVariable) { > + NeedClose =3D FALSE; > + Status =3D gBS->InstallMultipleProtocolInterfaces ( > + &ControllerHandle, > + &gEfiConsoleOutDeviceGuid, > + NULL, > + NULL > + ); > + } > + // > + // If the device path is an instance in the ErrOut environment variabl= e, > + // then install EfiStandardErrorDeviceGuid onto ControllerHandle > // > - if (IsHotPlugDevice (DevicePath)) { > + if (IsInErrOutVariable) { > + NeedClose =3D FALSE; > gBS->InstallMultipleProtocolInterfaces ( > &ControllerHandle, > - &gEfiConsoleOutDeviceGuid, > + &gEfiStandardErrorDeviceGuid, > NULL, > NULL > ); > - // > - // Append the device path to ConOutDev only if it is in ConOut varia= ble. > - // > - if (IsInConOutVariable) { > - ConPlatformUpdateDeviceVariable ( > - L"ConOutDev", > - DevicePath, > - Append > - ); > - } > - // > - // Append the device path to ErrOutDev only if it is in ErrOut varia= ble. > - // > - if (IsInErrOutVariable) { > - ConPlatformUpdateDeviceVariable ( > - L"ErrOutDev", > - DevicePath, > - Append > - ); > - } > - } else { > - // > - // If it is not a hot-plug device, append the device path to > - // the ConOutDev and ErrOutDev environment variable. > - // For GOP device path, append the sibling device path as well. > - // > - if (!ConPlatformUpdateGopCandidate (DevicePath)) { > - ConPlatformUpdateDeviceVariable ( > - L"ConOutDev", > - DevicePath, > - Append > - ); > - // > - // Then append the device path to the ErrOutDev environment variab= le > - // > - ConPlatformUpdateDeviceVariable ( > - L"ErrOutDev", > - DevicePath, > - Append > - ); > - } > - > - // > - // If the device path is an instance in the ConOut environment varia= ble, > - // then install EfiConsoleOutDeviceGuid onto ControllerHandle > - // > - if (IsInConOutVariable) { > - NeedClose =3D FALSE; > - Status =3D gBS->InstallMultipleProtocolInterfaces ( > - &ControllerHandle, > - &gEfiConsoleOutDeviceGuid, > - NULL, > - NULL > - ); > - } > - // > - // If the device path is an instance in the ErrOut environment varia= ble, > - // then install EfiStandardErrorDeviceGuid onto ControllerHandle > - // > - if (IsInErrOutVariable) { > - NeedClose =3D FALSE; > - gBS->InstallMultipleProtocolInterfaces ( > - &ControllerHandle, > - &gEfiStandardErrorDeviceGuid, > - NULL, > - NULL > - ); > - } > + } >=20 > - if (NeedClose) { > - gBS->CloseProtocol ( > - ControllerHandle, > - &gEfiSimpleTextOutProtocolGuid, > - This->DriverBindingHandle, > - ControllerHandle > - ); > - } > + if (NeedClose) { > + gBS->CloseProtocol ( > + ControllerHandle, > + &gEfiSimpleTextOutProtocolGuid, > + This->DriverBindingHandle, > + ControllerHandle > + ); > } >=20 > return EFI_SUCCESS; > @@ -822,6 +762,288 @@ IsGopSibling ( > return (BOOLEAN) (CompareMem (Left, Right, (UINTN) NodeLeft - (UINTN) > Left) =3D=3D 0); > } >=20 > +/** > + Check whether a USB device match the specified USB Class device path. > This > + function follows "Load Option Processing" behavior in UEFI specificati= on. > + > + @param UsbIo USB I/O protocol associated with the USB device. > + @param UsbClass The USB Class device path to match. > + > + @retval TRUE The USB device match the USB Class device path. > + @retval FALSE The USB device does not match the USB Class device = path. > + > +**/ > +BOOLEAN > +MatchUsbClass ( > + IN EFI_USB_IO_PROTOCOL *UsbIo, > + IN USB_CLASS_DEVICE_PATH *UsbClass > + ) > +{ > + EFI_STATUS Status; > + EFI_USB_DEVICE_DESCRIPTOR DevDesc; > + EFI_USB_INTERFACE_DESCRIPTOR IfDesc; > + UINT8 DeviceClass; > + UINT8 DeviceSubClass; > + UINT8 DeviceProtocol; > + > + if ((DevicePathType (UsbClass) !=3D MESSAGING_DEVICE_PATH) || > + (DevicePathSubType (UsbClass) !=3D MSG_USB_CLASS_DP)){ > + return FALSE; > + } > + > + // > + // Check Vendor Id and Product Id. > + // > + Status =3D UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc); > + if (EFI_ERROR (Status)) { > + return FALSE; > + } > + > + if ((UsbClass->VendorId !=3D 0xffff) && > + (UsbClass->VendorId !=3D DevDesc.IdVendor)) { > + return FALSE; > + } > + > + if ((UsbClass->ProductId !=3D 0xffff) && > + (UsbClass->ProductId !=3D DevDesc.IdProduct)) { > + return FALSE; > + } > + > + DeviceClass =3D DevDesc.DeviceClass; > + DeviceSubClass =3D DevDesc.DeviceSubClass; > + DeviceProtocol =3D DevDesc.DeviceProtocol; > + if (DeviceClass =3D=3D 0) { > + // > + // If Class in Device Descriptor is set to 0, use the Class, SubClas= s and > + // Protocol in Interface Descriptor instead. > + // > + Status =3D UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc); > + if (EFI_ERROR (Status)) { > + return FALSE; > + } > + > + DeviceClass =3D IfDesc.InterfaceClass; > + DeviceSubClass =3D IfDesc.InterfaceSubClass; > + DeviceProtocol =3D IfDesc.InterfaceProtocol; > + } > + > + // > + // Check Class, SubClass and Protocol. > + // > + if ((UsbClass->DeviceClass !=3D 0xff) && > + (UsbClass->DeviceClass !=3D DeviceClass)) { > + return FALSE; > + } > + > + if ((UsbClass->DeviceSubClass !=3D 0xff) && > + (UsbClass->DeviceSubClass !=3D DeviceSubClass)) { > + return FALSE; > + } > + > + if ((UsbClass->DeviceProtocol !=3D 0xff) && > + (UsbClass->DeviceProtocol !=3D DeviceProtocol)) { > + return FALSE; > + } > + > + return TRUE; > +} > + > +/** > + Check whether a USB device match the specified USB WWID device path. > This > + function follows "Load Option Processing" behavior in UEFI specificati= on. > + > + @param UsbIo USB I/O protocol associated with the USB device. > + @param UsbWwid The USB WWID device path to match. > + > + @retval TRUE The USB device match the USB WWID device path. > + @retval FALSE The USB device does not match the USB WWID device > path. > + > +**/ > +BOOLEAN > +MatchUsbWwid ( > + IN EFI_USB_IO_PROTOCOL *UsbIo, > + IN USB_WWID_DEVICE_PATH *UsbWwid > + ) > +{ > + EFI_STATUS Status; > + EFI_USB_DEVICE_DESCRIPTOR DevDesc; > + EFI_USB_INTERFACE_DESCRIPTOR IfDesc; > + UINT16 *LangIdTable; > + UINT16 TableSize; > + UINT16 Index; > + CHAR16 *CompareStr; > + UINTN CompareLen; > + CHAR16 *SerialNumberStr; > + UINTN Length; > + > + if ((DevicePathType (UsbWwid) !=3D MESSAGING_DEVICE_PATH) || > + (DevicePathSubType (UsbWwid) !=3D MSG_USB_WWID_DP)) { > + return FALSE; > + } > + > + // > + // Check Vendor Id and Product Id. > + // > + Status =3D UsbIo->UsbGetDeviceDescriptor (UsbIo, &DevDesc); > + if (EFI_ERROR (Status)) { > + return FALSE; > + } > + if ((DevDesc.IdVendor !=3D UsbWwid->VendorId) || > + (DevDesc.IdProduct !=3D UsbWwid->ProductId)) { > + return FALSE; > + } > + > + // > + // Check Interface Number. > + // > + Status =3D UsbIo->UsbGetInterfaceDescriptor (UsbIo, &IfDesc); > + if (EFI_ERROR (Status)) { > + return FALSE; > + } > + if (IfDesc.InterfaceNumber !=3D UsbWwid->InterfaceNumber) { > + return FALSE; > + } > + > + // > + // Check Serial Number. > + // > + if (DevDesc.StrSerialNumber =3D=3D 0) { > + return FALSE; > + } > + > + // > + // Get all supported languages. > + // > + TableSize =3D 0; > + LangIdTable =3D NULL; > + Status =3D UsbIo->UsbGetSupportedLanguages (UsbIo, &LangIdTable, > &TableSize); > + if (EFI_ERROR (Status) || (TableSize =3D=3D 0) || (LangIdTable =3D=3D = NULL)) { > + return FALSE; > + } > + > + // > + // Serial number in USB WWID device path is the last 64-or-less UTF-16 > characters. > + // > + CompareStr =3D (CHAR16 *) (UINTN) (UsbWwid + 1); > + CompareLen =3D (DevicePathNodeLength (UsbWwid) - sizeof > (USB_WWID_DEVICE_PATH)) / sizeof (CHAR16); > + if (CompareStr[CompareLen - 1] =3D=3D L'\0') { > + CompareLen--; > + } > + > + // > + // Compare serial number in each supported language. > + // > + for (Index =3D 0; Index < TableSize / sizeof (UINT16); Index++) { > + SerialNumberStr =3D NULL; > + Status =3D UsbIo->UsbGetStringDescriptor ( > + UsbIo, > + LangIdTable[Index], > + DevDesc.StrSerialNumber, > + &SerialNumberStr > + ); > + if (EFI_ERROR (Status) || (SerialNumberStr =3D=3D NULL)) { > + continue; > + } > + > + Length =3D StrLen (SerialNumberStr); > + if ((Length >=3D CompareLen) && > + (CompareMem (SerialNumberStr + Length - CompareLen, CompareStr, > CompareLen * sizeof (CHAR16)) =3D=3D 0)) { > + FreePool (SerialNumberStr); > + return TRUE; > + } > + > + FreePool (SerialNumberStr); > + } > + > + return FALSE; > +} > + > +/** > + Compare whether a full console device path matches a USB shortform > device path. > + > + @param[in] FullPath Full console device path. > + @param[in] ShortformPath Short-form device path. Short-form device > node may in the beginning or in the middle. > + > + @retval TRUE The full console device path matches the short-form devi= ce > path. > + @retval FALSE The full console device path doesn't match the short-for= m > device path. > +**/ > +BOOLEAN > +MatchUsbShortformDevicePath ( > + IN EFI_DEVICE_PATH_PROTOCOL *FullPath, > + IN EFI_DEVICE_PATH_PROTOCOL *ShortformPath > + ) > +{ > + EFI_STATUS Status; > + EFI_DEVICE_PATH_PROTOCOL *ShortformNode; > + EFI_DEVICE_PATH_PROTOCOL *ShortformRemainingDevicePath; > + UINTN ParentDevicePathSize; > + EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; > + EFI_USB_IO_PROTOCOL *UsbIo; > + EFI_HANDLE Handle; > + > + for ( ShortformNode =3D ShortformPath > + ; !IsDevicePathEnd (ShortformNode) > + ; ShortformNode =3D NextDevicePathNode (ShortformNode) > + ) { > + if ((DevicePathType (ShortformNode) =3D=3D MESSAGING_DEVICE_PATH) && > + ((DevicePathSubType (ShortformNode) =3D=3D MSG_USB_CLASS_DP) || > + (DevicePathSubType (ShortformNode) =3D=3D MSG_USB_WWID_DP)) > + ) { > + break; > + } > + } > + > + // > + // Skip further compare when it's not a shortform device path. > + // > + if (IsDevicePathEnd (ShortformNode)) { > + return FALSE; > + } > + > + // > + // Match the parent device path below USB layer when the ShortformPath > doesn't start with short-form node. > + // > + ParentDevicePathSize =3D (UINTN) ShortformNode - (UINTN) > ShortformPath; > + ShortformRemainingDevicePath =3D NextDevicePathNode (ShortformNode); > + > + RemainingDevicePath =3D FullPath; > + Status =3D gBS->LocateDevicePath (&gEfiUsbIoProtocolGuid, > &RemainingDevicePath, &Handle); > + if (EFI_ERROR (Status)) { > + return FALSE; > + } > + > + if (ParentDevicePathSize !=3D 0) { > + // > + // Skip comparing the parent device path when ShortformPath begins > with short-form node. > + // > + if ((ParentDevicePathSize !=3D (UINTN) RemainingDevicePath - (UINTN) > FullPath) || > + (CompareMem (FullPath, ShortformPath, ParentDevicePathSize) !=3D= 0)) > { > + return FALSE; > + } > + } > + > + // > + // Match the remaining device path above USB layer. > + // For USB keyboard, the remaining device path above USB layer is END > node. > + // > + if (CompareMem (RemainingDevicePath, ShortformRemainingDevicePath, > GetDevicePathSize (RemainingDevicePath)) !=3D 0) { > + return FALSE; > + } > + > + // > + // Match the USB layer. > + // > + Status =3D gBS->HandleProtocol( > + Handle, > + &gEfiUsbIoProtocolGuid, > + (VOID **) &UsbIo > + ); > + ASSERT_EFI_ERROR (Status); > + > + return MatchUsbClass (UsbIo, (USB_CLASS_DEVICE_PATH > *)ShortformNode) || > + MatchUsbWwid (UsbIo, (USB_WWID_DEVICE_PATH > *)ShortformNode); > +} > + > /** > Function compares a device path data structure to that of all the node= s of a > second device path instance. > @@ -881,7 +1103,8 @@ ConPlatformMatchDevicePaths ( > // Search for the match of 'Single' in 'Multi' > // > while (DevicePathInst !=3D NULL) { > - if ((CompareMem (Single, DevicePathInst, Size) =3D=3D 0) || IsGopSib= ling > (Single, DevicePathInst)) { > + if ((CompareMem (Single, DevicePathInst, Size) =3D=3D 0) || > + IsGopSibling (Single, DevicePathInst) || MatchUsbShortformDevicePa= th > (Single, DevicePathInst)) { > if (!Delete) { > // > // If Delete is FALSE, return EFI_SUCCESS if Single is found in = Multi. > @@ -1029,53 +1252,6 @@ ConPlatformUpdateDeviceVariable ( > return Status; > } >=20 > -/** > - 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 =3D DevicePath; > - while (!IsDevicePathEnd (CheckDevicePath)) { > - // > - // Check device whether is hot plug device or not throught Device Pa= th > - // > - if ((DevicePathType (CheckDevicePath) =3D=3D MESSAGING_DEVICE_PATH) > && > - (DevicePathSubType (CheckDevicePath) =3D=3D MSG_USB_DP || > - DevicePathSubType (CheckDevicePath) =3D=3D MSG_USB_CLASS_DP || > - DevicePathSubType (CheckDevicePath) =3D=3D MSG_USB_WWID_DP)) { > - // > - // If Device is USB device > - // > - return TRUE; > - } > - if ((DevicePathType (CheckDevicePath) =3D=3D HARDWARE_DEVICE_PATH) > && > - (DevicePathSubType (CheckDevicePath) =3D=3D HW_PCCARD_DP)) { > - // > - // If Device is PCCard > - // > - return TRUE; > - } > - > - CheckDevicePath =3D NextDevicePathNode (CheckDevicePath); > - } > - > - return FALSE; > -} > - > /** > Update ConOutDev and ErrOutDev variables to add the device path of > GOP controller itself and the sibling controllers. > diff --git > a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h > b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h > index 6d853c1360..28f882afeb 100644 > --- a/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h > +++ b/MdeModulePkg/Universal/Console/ConPlatformDxe/ConPlatform.h > @@ -1,7 +1,7 @@ > /** @file > Header file for Console Platfrom DXE Driver. >=20 > -Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.
> +Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BS= D > License > which accompanies this distribution. The full text of the license may b= e > found at > @@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, EITHER EXPRESS OR IMPLIED. > #include > #include > #include > +#include > #include >=20 > #include > @@ -294,23 +295,6 @@ ConPlatformUpdateDeviceVariable ( > IN CONPLATFORM_VAR_OPERATION Operation > ); >=20 > -/** > - 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 Component Name Functions > // > -- > 2.16.1.windows.1