From patchwork Wed Jul 5 17:47:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Heinrich Schuchardt X-Patchwork-Id: 784803 X-Patchwork-Delegate: agraf@suse.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3x2pKm6Kxkz9s75 for ; Thu, 6 Jul 2017 03:49:48 +1000 (AEST) Received: by lists.denx.de (Postfix, from userid 105) id 9184EC21DD1; Wed, 5 Jul 2017 17:49:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_DNSWL_NONE autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 585FCC21EC8; Wed, 5 Jul 2017 17:49:14 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 2282FC21ED6; Wed, 5 Jul 2017 17:49:01 +0000 (UTC) Received: from mout.gmx.net (mout.gmx.net [212.227.15.19]) by lists.denx.de (Postfix) with ESMTPS id 35075C21EBA for ; Wed, 5 Jul 2017 17:48:58 +0000 (UTC) Received: from workstation4.fritz.box ([88.152.145.149]) by mail.gmx.com (mrgmx002 [212.227.17.184]) with ESMTPSA (Nemesis) id 0LdYxu-1eBSdE23dq-00igVX; Wed, 05 Jul 2017 19:48:10 +0200 From: Heinrich Schuchardt To: Alexander Graf Date: Wed, 5 Jul 2017 19:47:14 +0200 Message-Id: <20170705174715.28626-3-xypron.glpk@gmx.de> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170705174715.28626-1-xypron.glpk@gmx.de> References: <20170705174715.28626-1-xypron.glpk@gmx.de> X-Provags-ID: V03:K0:zt5AvZBBqhP2cWds2L6I0U16p4cWD6vQZRfiIGnafWyyPpfnov+ 2Ramf0KdNlRfKRcauohGnUZAl+RY8fAkvC3p+rwf+Pt4S6lntjQhEzD67h3fxafNuh24eNy RKT7TvmugALnIbQ1c3YUTcdhQ09Qpy3Wt1X9K61yp5Phza0xJuEVoF0zSiKaQ7ZXZMLIyQQ QAUFl1awG1Gxq5/NCd4Og== X-UI-Out-Filterresults: notjunk:1; V01:K0:WOGnlytJ61I=:uzPjrbKIDY8P6K9adOMpgz a6EJ7pqVbPkr3+GD5Xw5ytImZwvwtVM/27yQ9bdwK5NcnJXLjD7hUFkCGcm13gQNp5ob93fV0 ch+voeMmi/v2Lt4STUJ5Y8PCb+HryCdzKuwqUQBN1d88iQS1IHfBLiXKUi0p13JY8rF0ZSjhv 6Z8OGhzTdtbmTaBzOIp6HMnPBWCFRgQmEk0aPZJadbCych3mZHUIPPdEPX6GI/cPeqeX5Bgki WLRFfDoKMZJj94CF6mDqE90VQewHt9Vlipqk8qXMJVKybZglwRKsIpY0HDPzsXcDw+kMeimqS HegGgK43VCWeeJWN4O12WsbHu2sRY6qTc6Ltpc8j1bE3RS/adA4s9awnxXM/0mRTcC7Y+P69p hioCJ6544n8o6qJi2gDm2Ki26czGE3Yn9sbG2jxQ1AVOL0rE7uwK/SkxjVBR2qYntUkR4V7aj Y0GWQUflklkvXjpWhoXisLNsv+n9sHjw/aSmVK23CoDa+XVLLEPLcNtBOKPntB8KCu6VNk44Q XZAkEBHx1w+Y/d1G1JMgtovMCzBH0rasYjb5vLybw65mTRoNevlAI7NR7AVC+7pS7nGWqLn4F QoQS2dao8Ka2wkZ0T/ljIxGLRCBZ0AVNVBTl6l5pgmfv9xNcgyZLB7dOacTPKlfn2ZFvSuzDj megNmpHI9pLDrBk3P3CMwlud/V6M9rOSFGhd02kNmXFJL+WiX5T3cj5e/UscFrZIZKG/dBoAH NCyBVQzoMcaKdEncMv/RWG3WKLcC433Q/Q7JtHEiVu3DUdcJ1oLRPjl4rRc= Cc: u-boot@lists.denx.de, Heinrich Schuchardt Subject: [U-Boot] [PATCH 2/3] efi_loader: implement WaitForKey X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The EFI_SIMPLE_TEXT_INPUT_PROTOCOL requires an event WaitForKey. We can easily signal the event in the efi_timer_check function. Signed-off-by: Heinrich Schuchardt --- include/efi_loader.h | 5 ++++- lib/efi_loader/efi_boottime.c | 17 ++++++++++++++--- lib/efi_loader/efi_console.c | 2 +- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/efi_loader.h b/include/efi_loader.h index a35b971f7e..d7344d54e4 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -92,7 +92,10 @@ struct efi_event { enum efi_event_type trigger_type; int signaled; }; - +extern struct efi_event efi_events[]; +#define WAIT_FOR_KEY_EVENT (&efi_events[0]) +/* Events below this number cannot be closed */ +#define FIRST_EDITABLE_EVENT 1 /* This list contains all UEFI objects we know of */ extern struct list_head efi_obj_list; diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c index ef3e7d9d52..f509d457a7 100644 --- a/lib/efi_loader/efi_boottime.c +++ b/lib/efi_loader/efi_boottime.c @@ -165,7 +165,13 @@ static efi_status_t EFIAPI efi_free_pool_ext(void *buffer) * Our event capabilities are very limited. Only a small limited * number of events is allowed to coexist. */ -static struct efi_event efi_events[16]; +struct efi_event efi_events[16] = { + { + /* WaitForKey */ + .type = EVT_NOTIFY_WAIT, + .trigger_next = -1ULL, + } +}; static efi_status_t EFIAPI efi_create_event( enum efi_event_type type, ulong notify_tpl, @@ -187,7 +193,8 @@ static efi_status_t EFIAPI efi_create_event( notify_function == NULL) return EFI_EXIT(EFI_INVALID_PARAMETER); - for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { + /* Use first empty slot */ + for (i = FIRST_EDITABLE_EVENT; i < ARRAY_SIZE(efi_events); ++i) { if (efi_events[i].type) continue; efi_events[i].type = type; @@ -212,6 +219,10 @@ void efi_timer_check(void) int i; u64 now = timer_get_us(); + /* Signal keystroke */ + if (tstc()) + efi_events[0].signaled = 1; + for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { if (!(efi_events[i].type & EVT_TIMER) || efi_events[i].trigger_type == EFI_TIMER_STOP || @@ -315,7 +326,7 @@ static efi_status_t EFIAPI efi_close_event(void *event) int i; EFI_ENTRY("%p", event); - for (i = 0; i < ARRAY_SIZE(efi_events); ++i) { + for (i = FIRST_EDITABLE_EVENT; i < ARRAY_SIZE(efi_events); ++i) { if (event != &efi_events[i]) continue; efi_events[i].type = 0; diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c index 8ef7326fef..b2d9ff5497 100644 --- a/lib/efi_loader/efi_console.c +++ b/lib/efi_loader/efi_console.c @@ -424,5 +424,5 @@ static efi_status_t EFIAPI efi_cin_read_key_stroke( const struct efi_simple_input_interface efi_con_in = { .reset = efi_cin_reset, .read_key_stroke = efi_cin_read_key_stroke, - .wait_for_key = NULL, + .wait_for_key = WAIT_FOR_KEY_EVENT, };