176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*++
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanCopyright (c) 1998  Intel Corporation
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanModule Name:
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    event.c
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanAbstract:
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanRevision History
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman--*/
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "lib.h"
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2176d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_EVENT
2276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanLibCreateProtocolNotifyEvent (
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN EFI_GUID             *ProtocolGuid,
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN EFI_TPL              NotifyTpl,
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN EFI_EVENT_NOTIFY     NotifyFunction,
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN VOID                 *NotifyContext,
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    OUT VOID                *Registration
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    )
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_STATUS              Status;
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_EVENT               Event;
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Create the event
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Status = uefi_call_wrapper(
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    BS->CreateEvent,
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			5,
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    EVT_NOTIFY_SIGNAL,
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    NotifyTpl,
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    NotifyFunction,
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    NotifyContext,
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    &Event
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    );
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ASSERT (!EFI_ERROR(Status));
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Register for protocol notifactions on this event
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    Status = uefi_call_wrapper(
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		    BS->RegisterProtocolNotify,
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman			3,
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                    ProtocolGuid,
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                    Event,
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                    Registration
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                    );
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    ASSERT (!EFI_ERROR(Status));
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // Kick the event so we will perform an initial pass of
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    // current installed drivers
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    //
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uefi_call_wrapper(BS->SignalEvent, 1, Event);
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return Event;
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
7376d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitForSingleEvent (
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN EFI_EVENT        Event,
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN UINT64           Timeout OPTIONAL
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    )
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_STATUS          Status;
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    UINTN               Index;
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_EVENT           TimerEvent;
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_EVENT           WaitList[2];
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    if (Timeout) {
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        //
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        // Create a timer event
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        //
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        Status = uefi_call_wrapper(BS->CreateEvent, 5, EVT_TIMER, 0, NULL, NULL, &TimerEvent);
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (!EFI_ERROR(Status)) {
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            //
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            // Set the timer event
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            //
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            uefi_call_wrapper(BS->SetTimer, 3, TimerEvent, TimerRelative, Timeout);
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            //
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            // Wait for the original event or the timer
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            //
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            WaitList[0] = Event;
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            WaitList[1] = TimerEvent;
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            Status = uefi_call_wrapper(BS->WaitForEvent, 3, 2, WaitList, &Index);
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            uefi_call_wrapper(BS->CloseEvent, 1, TimerEvent);
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            //
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            // If the timer expired, change the return to timed out
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            //
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (!EFI_ERROR(Status)  &&  Index == 1) {
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                Status = EFI_TIMEOUT;
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } else {
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        //
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        // No timeout... just wait on the event
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        //
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        Status = uefi_call_wrapper(BS->WaitForEvent, 3, 1, &Event, &Index);
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        ASSERT (!EFI_ERROR(Status));
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        ASSERT (Index == 0);
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    }
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    return Status;
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
12976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVOID
13076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanWaitForEventWithTimeout (
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN  EFI_EVENT       Event,
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN  UINTN           Timeout,
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN  UINTN           Row,
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN  UINTN           Column,
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN  CHAR16          *String,
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    IN  EFI_INPUT_KEY   TimeoutKey,
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    OUT EFI_INPUT_KEY   *Key
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    )
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    EFI_STATUS      Status;
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    do {
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        PrintAt (Column, Row, String, Timeout);
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        Status = WaitForSingleEvent (Event, 10000000);
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        if (Status == EFI_SUCCESS) {
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            if (!EFI_ERROR(uefi_call_wrapper(ST->ConIn->ReadKeyStroke, 2, ST->ConIn, Key))) {
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                return;
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman            }
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        }
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    } while (Timeout > 0);
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    *Key = TimeoutKey;
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
154