/** @file Private definitions of the VirtioKeyboard driver Copyright (C) 2024, Red Hat SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _VIRTIO_KEYBOARD_DXE_H_ #define _VIRTIO_KEYBOARD_DXE_H_ #include #include #include #include #include #define VIRTIO_KBD_SIG SIGNATURE_32 ('V', 'K', 'B', 'D') #define KEYBOARD_MAX_RINGS 2 #define KEYBOARD_RX_BUFSIZE 64 // Fetch new key from VirtIO every 50ms #define KEYBOARD_PROBE_TIME_MS 50 // Max range of recognized keyboard codes #define MAX_KEYBOARD_CODE 255 typedef struct { UINTN Signature; EFI_KEY_DATA KeyData; EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn; LIST_ENTRY NotifyEntry; } VIRTIO_KBD_IN_EX_NOTIFY; // Data structure representing payload delivered from VirtIo typedef struct { UINT16 Type; UINT16 Code; UINT32 Value; } VIRTIO_KBD_EVENT; // Data structure representing ring buffer typedef struct { VRING Ring; VOID *RingMap; DESC_INDICES Indices; /* Avail Ring */ UINT16 LastUsedIdx; /* Used Ring */ UINT32 BufferSize; UINT32 BufferCount; UINT32 BufferPages; UINT8 *Buffers; VOID *BufferMap; EFI_PHYSICAL_ADDRESS DeviceAddress; BOOLEAN Ready; } VIRTIO_KBD_RING; // Declaration of data structure representing driver context typedef struct { // Device signature UINT32 Signature; // Hook for the function which shall be caled when driver is closed // before system state changes to boot EFI_EVENT ExitBoot; // Hooks for functions required by UEFI keyboard API // struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL { // EFI_INPUT_RESET Reset; // EFI_INPUT_READ_KEY ReadKeyStroke; // EFI_EVENT WaitForKey; // }; EFI_SIMPLE_TEXT_INPUT_PROTOCOL Txt; // struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL { // EFI_INPUT_RESET_EX Reset; // EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx; // EFI_EVENT WaitForKeyEx; // EFI_SET_STATE SetState; // EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify; // EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify; // } EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL TxtEx; // Virtio device hook VIRTIO_DEVICE_PROTOCOL *VirtIo; // Hook for ring buffer VIRTIO_KBD_RING Rings[KEYBOARD_MAX_RINGS]; // Timer event for checking key presses from VirtIo EFI_EVENT KeyReadTimer; // List for notifications LIST_ENTRY NotifyList; EFI_EVENT KeyNotifyTimer; // Last pressed key // typedef struct { // UINT16 ScanCode; // CHAR16 UnicodeChar; // } EFI_INPUT_KEY; EFI_INPUT_KEY LastKey; // Key modifiers BOOLEAN KeyActive[MAX_KEYBOARD_CODE]; // If key is ready BOOLEAN KeyReady; } VIRTIO_KBD_DEV; // Helper functions to extract VIRTIO_KBD_DEV structure pointers #define VIRTIO_KEYBOARD_FROM_THIS(KbrPointer) \ CR (KbrPointer, VIRTIO_KBD_DEV, Txt, VIRTIO_KBD_SIG) #define VIRTIO_KEYBOARD_EX_FROM_THIS(KbrPointer) \ CR (KbrPointer, VIRTIO_KBD_DEV, TxtEx, VIRTIO_KBD_SIG) // Bellow candidates to be included as Linux header #define KEY_PRESSED 1 // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardSimpleTextInputReset ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardSimpleTextInputReadKeyStroke ( IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, OUT EFI_INPUT_KEY *Key ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_PROTOCOL API VOID EFIAPI VirtioKeyboardWaitForKey ( IN EFI_EVENT Event, IN VOID *Context ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardResetEx ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN BOOLEAN ExtendedVerification ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardReadKeyStrokeEx ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, OUT EFI_KEY_DATA *KeyData ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API VOID EFIAPI VirtioKeyboardWaitForKeyEx ( IN EFI_EVENT Event, IN VOID *Context ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardSetState ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_TOGGLE_STATE *KeyToggleState ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardRegisterKeyNotify ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_KEY_DATA *KeyData, IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, OUT VOID **NotifyHandle ); // ----------------------------------------------------------------------------- // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API EFI_STATUS EFIAPI VirtioKeyboardUnregisterKeyNotify ( IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN VOID *NotificationHandle ); #endif