From: "Ni, Ruiyu" <ruiyu.ni@intel.com>
To: "Zeng, Star" <star.zeng@intel.com>,
"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Kinney, Michael D" <michael.d.kinney@intel.com>,
"Tian, Feng" <feng.tian@intel.com>,
"Zeng, Star" <star.zeng@intel.com>
Subject: Re: [PATCH 1/5] MdeModulePkg UsbKbDxe: Execute key notify func at TPL_CALLBACK
Date: Fri, 23 Dec 2016 07:01:08 +0000 [thread overview]
Message-ID: <734D49CCEBEEF84792F5B80ED585239D5B86226D@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <1482414310-33036-2-git-send-email-star.zeng@intel.com>
Star,
I have one comment:
When call Enque(), can we put comments above the call to say that the key notification
function needs to run at TPL_CALLBACK while current TPL is TPL_NOTIFY. It will be called
in KeyNotifyProcessHandler() which runs at TPL_CALLBACK?
Regards,
Ray
>-----Original Message-----
>From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Star Zeng
>Sent: Thursday, December 22, 2016 9:45 PM
>To: edk2-devel@lists.01.org
>Cc: Ni, Ruiyu <ruiyu.ni@intel.com>; Kinney, Michael D <michael.d.kinney@intel.com>; Tian, Feng <feng.tian@intel.com>;
>Zeng, Star <star.zeng@intel.com>
>Subject: [edk2] [PATCH 1/5] MdeModulePkg UsbKbDxe: Execute key notify func at TPL_CALLBACK
>
>Current implementation executes key notify function in TimerHandler
>at TPL_NOTIFY. The code change is to make key notify function
>executed at TPL_CALLBACK to reduce the time occupied at TPL_NOTIFY.
>
>The code will signal KeyNotify process event if the key pressed
>matches any key registered and insert the KeyData to the EFI Key
>queue for notify, then the KeyNotify process handler will invoke
>key notify functions at TPL_CALLBACK.
>
>Cc: Ruiyu Ni <Ruiyu.ni@intel.com>
>Cc: Michael Kinney <michael.d.kinney@intel.com>
>Cc: Feng Tian <feng.tian@intel.com>
>Contributed-under: TianoCore Contribution Agreement 1.0
>Signed-off-by: Star Zeng <star.zeng@intel.com>
>---
> MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.c | 64 +++++++++++++++++++++++++++++++-
> MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.h | 17 ++++++++-
> MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c | 10 +++--
> 3 files changed, 86 insertions(+), 5 deletions(-)
>
>diff --git a/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.c b/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.c
>index fb7558b73070..b1e1657173c3 100644
>--- a/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.c
>+++ b/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.c
>@@ -2,7 +2,7 @@
> USB Keyboard Driver that manages USB keyboard and produces Simple Text Input
> Protocol and Simple Text Input Ex Protocol.
>
>-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
>+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> This program and the accompanying materials
> are licensed and made available under the terms and conditions of the BSD License
> which accompanies this distribution. The full text of the license may be found at
>@@ -312,6 +312,17 @@ USBKeyboardDriverBindingStart (
> goto ErrorExit;
> }
>
>+ Status = gBS->CreateEvent (
>+ EVT_NOTIFY_SIGNAL,
>+ TPL_CALLBACK,
>+ KeyNotifyProcessHandler,
>+ UsbKeyboardDevice,
>+ &UsbKeyboardDevice->KeyNotifyProcessEvent
>+ );
>+ if (EFI_ERROR (Status)) {
>+ goto ErrorExit;
>+ }
>+
> //
> // Install Simple Text Input Protocol and Simple Text Input Ex Protocol
> // for the USB keyboard device.
>@@ -427,6 +438,9 @@ ErrorExit:
> if (UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx != NULL) {
> gBS->CloseEvent (UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx);
> }
>+ if (UsbKeyboardDevice->KeyNotifyProcessEvent != NULL) {
>+ gBS->CloseEvent (UsbKeyboardDevice->KeyNotifyProcessEvent);
>+ }
> if (UsbKeyboardDevice->KeyboardLayoutEvent != NULL) {
> ReleaseKeyboardLayoutResources (UsbKeyboardDevice);
> gBS->CloseEvent (UsbKeyboardDevice->KeyboardLayoutEvent);
>@@ -548,6 +562,7 @@ USBKeyboardDriverBindingStop (
> gBS->CloseEvent (UsbKeyboardDevice->DelayedRecoveryEvent);
> gBS->CloseEvent (UsbKeyboardDevice->SimpleInput.WaitForKey);
> gBS->CloseEvent (UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx);
>+ gBS->CloseEvent (UsbKeyboardDevice->KeyNotifyProcessEvent);
> KbdFreeNotifyList (&UsbKeyboardDevice->NotifyList);
>
> ReleaseKeyboardLayoutResources (UsbKeyboardDevice);
>@@ -559,6 +574,7 @@ USBKeyboardDriverBindingStop (
>
> DestroyQueue (&UsbKeyboardDevice->UsbKeyQueue);
> DestroyQueue (&UsbKeyboardDevice->EfiKeyQueue);
>+ DestroyQueue (&UsbKeyboardDevice->EfiKeyQueueForNotify);
>
> FreePool (UsbKeyboardDevice);
>
>@@ -647,6 +663,7 @@ USBKeyboardReset (
> //
> InitQueue (&UsbKeyboardDevice->UsbKeyQueue, sizeof (USB_KEY));
> InitQueue (&UsbKeyboardDevice->EfiKeyQueue, sizeof (EFI_KEY_DATA));
>+ InitQueue (&UsbKeyboardDevice->EfiKeyQueueForNotify, sizeof (EFI_KEY_DATA));
>
> return EFI_SUCCESS;
> }
>@@ -1170,3 +1187,48 @@ USBKeyboardUnregisterKeyNotify (
> return EFI_INVALID_PARAMETER;
> }
>
>+/**
>+ Process key notify.
>+
>+ @param Event Indicates the event that invoke this function.
>+ @param Context Indicates the calling context.
>+**/
>+VOID
>+EFIAPI
>+KeyNotifyProcessHandler (
>+ IN EFI_EVENT Event,
>+ IN VOID *Context
>+ )
>+{
>+ USB_KB_DEV *UsbKeyboardDevice;
>+ EFI_KEY_DATA KeyData;
>+ LIST_ENTRY *Link;
>+ LIST_ENTRY *NotifyList;
>+ KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
>+ EFI_TPL OldTpl;
>+
>+ UsbKeyboardDevice = (USB_KB_DEV *) Context;
>+
>+ //
>+ // Invoke notification functions.
>+ //
>+ NotifyList = &UsbKeyboardDevice->NotifyList;
>+ while (!IsQueueEmpty (&UsbKeyboardDevice->EfiKeyQueueForNotify)) {
>+ //
>+ // Enter critical section
>+ //
>+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
>+ Dequeue (&UsbKeyboardDevice->EfiKeyQueueForNotify, &KeyData, sizeof (KeyData));
>+ //
>+ // Leave critical section
>+ //
>+ gBS->RestoreTPL (OldTpl);
>+ for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
>+ CurrentNotify = CR (Link, KEYBOARD_CONSOLE_IN_EX_NOTIFY, NotifyEntry,
>USB_KB_CONSOLE_IN_EX_NOTIFY_SIGNATURE);
>+ if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {
>+ CurrentNotify->KeyNotificationFn (&KeyData);
>+ }
>+ }
>+ }
>+}
>+
>diff --git a/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.h b/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.h
>index 58edb3f65f2b..089f113d5fd4 100644
>--- a/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.h
>+++ b/MdeModulePkg/Bus/Usb/UsbKbDxe/EfiKey.h
>@@ -1,7 +1,7 @@
> /** @file
> Header file for USB Keyboard Driver's Data Structures.
>
>-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
>+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>
> This program and the accompanying materials
> are licensed and made available under the terms and conditions of the BSD License
> which accompanies this distribution. The full text of the license may be found at
>@@ -114,6 +114,7 @@ typedef struct {
>
> USB_SIMPLE_QUEUE UsbKeyQueue;
> USB_SIMPLE_QUEUE EfiKeyQueue;
>+ USB_SIMPLE_QUEUE EfiKeyQueueForNotify;
> BOOLEAN CtrlOn;
> BOOLEAN AltOn;
> BOOLEAN ShiftOn;
>@@ -149,6 +150,7 @@ typedef struct {
> // Notification function list
> //
> LIST_ENTRY NotifyList;
>+ EFI_EVENT KeyNotifyProcessEvent;
>
> //
> // Non-spacing key list
>@@ -596,5 +598,18 @@ USBKeyboardTimerHandler (
> IN VOID *Context
> );
>
>+/**
>+ Process key notify.
>+
>+ @param Event Indicates the event that invoke this function.
>+ @param Context Indicates the calling context.
>+**/
>+VOID
>+EFIAPI
>+KeyNotifyProcessHandler (
>+ IN EFI_EVENT Event,
>+ IN VOID *Context
>+ );
>+
> #endif
>
>diff --git a/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c b/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c
>index fef1449e3c35..a017d51e3b97 100644
>--- a/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c
>+++ b/MdeModulePkg/Bus/Usb/UsbKbDxe/KeyBoard.c
>@@ -820,6 +820,7 @@ InitUSBKeyboard (
>
> InitQueue (&UsbKeyboardDevice->UsbKeyQueue, sizeof (USB_KEY));
> InitQueue (&UsbKeyboardDevice->EfiKeyQueue, sizeof (EFI_KEY_DATA));
>+ InitQueue (&UsbKeyboardDevice->EfiKeyQueueForNotify, sizeof (EFI_KEY_DATA));
>
> //
> // Use the config out of the descriptor
>@@ -1665,20 +1666,23 @@ UsbKeyCodeToEfiInputKey (
> KeyData->KeyState.KeyToggleState |= EFI_KEY_STATE_EXPOSED;
> }
> //
>- // Invoke notification functions if the key is registered.
>+ // Signal KeyNotify process event if this key pressed matches any key registered.
> //
> NotifyList = &UsbKeyboardDevice->NotifyList;
> for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
> CurrentNotify = CR (Link, KEYBOARD_CONSOLE_IN_EX_NOTIFY, NotifyEntry,
>USB_KB_CONSOLE_IN_EX_NOTIFY_SIGNATURE);
> if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
>- CurrentNotify->KeyNotificationFn (KeyData);
>+ //
>+ // Insert to the EFI Key queue for notify.
>+ //
>+ Enqueue (&UsbKeyboardDevice->EfiKeyQueueForNotify, KeyData, sizeof (*KeyData));
>+ gBS->SignalEvent (UsbKeyboardDevice->KeyNotifyProcessEvent);
> }
> }
>
> return EFI_SUCCESS;
> }
>
>-
> /**
> Create the queue.
>
>--
>2.7.0.windows.1
>
>_______________________________________________
>edk2-devel mailing list
>edk2-devel@lists.01.org
>https://lists.01.org/mailman/listinfo/edk2-devel
next prev parent reply other threads:[~2016-12-23 7:01 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-12-22 13:45 [PATCH 0/5] Execute key notify function at TPL_CALLBACK Star Zeng
2016-12-22 13:45 ` [PATCH 1/5] MdeModulePkg UsbKbDxe: Execute key notify func " Star Zeng
2016-12-23 7:01 ` Ni, Ruiyu [this message]
2016-12-23 7:05 ` Zeng, Star
2016-12-23 7:09 ` Ni, Ruiyu
2016-12-23 7:28 ` Zeng, Star
2016-12-22 13:45 ` [PATCH 2/5] MdeModulePkg TerminalDxe: " Star Zeng
2016-12-22 13:45 ` [PATCH 3/5] MdeModulePkg Ps2KbDxe: " Star Zeng
2016-12-22 13:45 ` [PATCH 4/5] IntelFrameworkModulePkg " Star Zeng
2016-12-23 2:16 ` Fan, Jeff
2016-12-22 13:45 ` [PATCH 5/5] IntelFrameworkModulePkg KbDxe: " Star Zeng
2016-12-23 2:16 ` Fan, Jeff
2016-12-23 7:11 ` [PATCH 0/5] Execute key notify function " Ni, Ruiyu
2016-12-23 8:14 ` Zeng, Star
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=734D49CCEBEEF84792F5B80ED585239D5B86226D@SHSMSX104.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox