From 46942dc800505e74f7e2576706661134029229ed Mon Sep 17 00:00:00 2001 From: Jozef Nagy Date: Fri, 29 Mar 2024 23:27:59 +0100 Subject: [PATCH] Fully implemented UEFI Driver Model protocols --- efi.h | 8 ++ efi_types.h | 11 +++ protocols/adapter_information.h | 78 ++++++++++++++++++++ protocols/component_name2.h | 32 ++++++++ protocols/device_path.h | 2 + protocols/driver_diagnostics2.h | 34 +++++++++ protocols/driver_family_override.h | 18 +++++ protocols/driver_health.h | 55 ++++++++++++++ protocols/driver_supported_efi_version.h | 13 ++++ protocols/loaded_image.h | 2 + protocols/platform_to_driver_configuration.h | 59 +++++++++++++++ protocols/service_binding.h | 25 +++++++ 12 files changed, 337 insertions(+) create mode 100644 protocols/adapter_information.h create mode 100644 protocols/component_name2.h create mode 100644 protocols/driver_diagnostics2.h create mode 100644 protocols/driver_family_override.h create mode 100644 protocols/driver_health.h create mode 100644 protocols/driver_supported_efi_version.h create mode 100644 protocols/platform_to_driver_configuration.h create mode 100644 protocols/service_binding.h diff --git a/efi.h b/efi.h index 4465b42..9cf6296 100644 --- a/efi.h +++ b/efi.h @@ -55,14 +55,22 @@ typedef struct { #include "efi_rs.h" #include "efi_bs.h" +#include "protocols/adapter_information.h" #include "protocols/boot_manager_policy.h" #include "protocols/bus_specific_driver_override.h" +#include "protocols/component_name2.h" #include "protocols/device_path.h" #include "protocols/driver_binding.h" +#include "protocols/driver_diagnostics2.h" +#include "protocols/driver_family_override.h" +#include "protocols/driver_health.h" +#include "protocols/driver_supported_efi_version.h" #include "protocols/file.h" #include "protocols/loaded_image.h" #include "protocols/loaded_image_device_path.h" #include "protocols/platform_driver_override.h" +#include "protocols/platform_to_driver_configuration.h" +#include "protocols/service_binding.h" #include "protocols/simple_file_system.h" #include "protocols/simple_text_input.h" #include "protocols/simple_text_output.h" diff --git a/efi_types.h b/efi_types.h index c05676f..2c171ab 100644 --- a/efi_types.h +++ b/efi_types.h @@ -49,6 +49,17 @@ typedef UINT64 EFI_VIRTUAL_ADDRESS; // Task Priority Level typedef UINTN EFI_TPL; +// String ID +typedef UINT16 EFI_STRING_ID; + +// HII Handle +typedef VOID *EFI_HII_HANDLE; + +// EFI Mac Address +typedef struct { + UINT8 Addr[32]; +} EFI_MAC_ADDRESS; + // EFI Status Codes #define EFI_SUCCESS (0x00) #define EFI_LOAD_ERROR (0x8000000000000001) diff --git a/protocols/adapter_information.h b/protocols/adapter_information.h new file mode 100644 index 0000000..f9c8560 --- /dev/null +++ b/protocols/adapter_information.h @@ -0,0 +1,78 @@ +#ifndef EFI_PROTOCOLS_ADAPTER_INFORMATION_H +#define EFI_PROTOCOLS_ADAPTER_INFORMATION_H + +#define EFI_ADAPTER_INFORMATION_PROTOCOL_GUID {0xe5dd1403,0xd622,0xc24e, {0x84,0x88,0xc7,0x1b,0x17,0xf5,0xe8,0x02}} +#define EFI_ADAPTER_INFO_MEDIA_STATE_GUID {0xd7c74207,0xa831,0x4a26, {0xb1,0xf5,0xd1,0x93,0x06,0x5c,0xe8,0xb6}} +#define EFI_ADAPTER_INFO_NETWORK_BOOT_GUID {0x1fbd2960,0x4130,0x41e5,{0x94,0xac,0xd2,0xcf,0x03,0x7f,0xb3,0x7c}} +#define EFI_ADAPTER_INFO_SAN_MAC_ADDRESS_GUID {0x114da5ef,0x2cf1,0x4e12, {0x9b,0xbb,0xc4,0x70,0xb5,0x52,0x05,0xd9}} +#define EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT_GUID {0x4bd56be3,0x4975,0x4d8a, {0xa0,0xad,0xc4,0x91,0x20,0x4b,0x5d,0x4d}} +#define EFI_ADAPTER_INFO_MEDIA_TYPE_GUID {0x8484472f,0x71ec,0x411a, {0xb3,0x9c,0x62,0xcd,0x94,0xd9,0x91,0x6e}} +#define EFI_ADAPTER_INFO_CDAT_TYPE_GUID {0x77af24d1,0xb6f0,0x42b9, {0x83,0xf5,0x8f,0xe6,0xe8,0x3e,0xb6,0xf0}} + +typedef struct _EFI_ADAPTER_INFORMATION_PROTOCOL EFI_ADAPTER_INFORMATION_PROTOCOL; + +typedef struct { + EFI_STATUS MediaState; +} EFI_ADAPTER_INFO_MEDIA_STATE; + +typedef struct { + BOOLEAN iSsciIpv4BootCapablity; + BOOLEAN iScsiIpv6BootCapablity; + BOOLEAN FCoeBootCapablity; + BOOLEAN OffloadCapability; + BOOLEAN iScsiMpioCapability; + BOOLEAN iScsiIpv4Boot; + BOOLEAN iScsiIpv6Boot; + BOOLEAN FCoeBoot; +} EFI_ADAPTER_INFO_NETWORK_BOOT; + +typedef struct { + EFI_MAC_ADDRESS SanMacAddress; +} EFI_ADAPTER_INFO_SAN_MAC_ADDRESS; + +typedef struct { + BOOLEAN Ipv6Support; +} EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT; + +typedef struct { + UINT8 MediaType; +} EFI_ADAPTER_INFO_MEDIA_TYPE; + +typedef struct { + UINTN CdatSize; + UINT8 Cdat[]; +} EFI_ADAPTER_INFO_CDAT_TYPE_TYPE; + +typedef +EFI_STATUS +(EFIAPI *EFI_ADAPTER_INFO_GET_INFO)( + IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, + IN EFI_GUID *InformationType, + OUT VOID **InformationBlock, + OUT UINTN *InformationBlockSize +); + +typedef +EFI_STATUS +(EFIAPI *EFI_ADAPTER_INFO_SET_INFO)( + IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, + IN EFI_GUID *InformationType, + IN VOID *InformationBlock, + IN UINTN InformationBlockSize +); + +typedef +EFI_STATUS +(EFIAPI *EFI_ADAPTER_INFO_GET_SUPPORTED_TYPES)( + IN EFI_ADAPTER_INFORMATION_PROTOCOL *This, + OUT EFI_GUID **InfoTypesBuffer, + OUT UINTN *InfoTypesBufferCount +); + +typedef struct _EFI_ADAPTER_INFORMATION_PROTOCOL { + EFI_ADAPTER_INFO_GET_INFO GetInformation; + EFI_ADAPTER_INFO_SET_INFO SetInformation; + EFI_ADAPTER_INFO_GET_SUPPORTED_TYPES GetSupportedTypes; +} EFI_ADAPTER_INFORMATION_PROTOCOL; + +#endif /* EFI_PROTOCOLS_ADAPTER_INFORMATION_H */ diff --git a/protocols/component_name2.h b/protocols/component_name2.h new file mode 100644 index 0000000..1eb373e --- /dev/null +++ b/protocols/component_name2.h @@ -0,0 +1,32 @@ +#ifndef EFI_PROTOCOLS_COMPONENT_NAME2_H +#define EFI_PROTOCOLS_COMPONENT_NAME2_H + +#define EFI_COMPONENT_NAME2_PROTOCOL_GUID {0x6a7a5cff,0xe8d9,0x4f70, {0xba,0xda,0x75,0xab,0x30,0x25,0xce,0x14}} + +typedef struct _EFI_COMPONENT_NAME2_PROTOCOL EFI_COMPONENT_NAME2_PROTOCOL; + +typedef +EFI_STATUS +(EFIAPI *EFI_COMPONENT_NAME_GET_DRIVER_NAME)( + IN EFI_COMPONENT_NAME2_PROTOCOL *This, + IN CHAR8 *Language, + OUT CHAR16 **DriverName +); + +typedef +EFI_STATUS +(EFIAPI *EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)( + IN EFI_COMPONENT_NAME2_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN CHAR8 *Language, + OUT CHAR16 **ControllerName +); + +typedef struct _EFI_COMPONENT_NAME2_PROTOCOL { + EFI_COMPONENT_NAME_GET_DRIVER_NAME GetDriverName; + EFI_COMPONENT_NAME_GET_CONTROLLER_NAME GetControllerName; + CHAR8 *SupportedLanguages; +} EFI_COMPONENT_NAME2_PROTOCOL; + +#endif /* EFI_PROTOCOLS_COMPONENT_NAME2_H */ diff --git a/protocols/device_path.h b/protocols/device_path.h index 422a3fd..012dd33 100644 --- a/protocols/device_path.h +++ b/protocols/device_path.h @@ -3,6 +3,8 @@ #define EFI_DEVICE_PATH_PROTOCOL_GUID {0x09576e91,0x6d3f,0x11d2,{0x8e,0x39,0x00,0xa0,0xc9,0x69,0x72,0x3b}} +typedef struct _EFI_DEVICE_PATH_PROTOCOL EFI_DEVICE_PATH_PROTOCOL; + typedef struct _EFI_DEVICE_PATH_PROTOCOL { UINT8 Type; UINT8 SubType; diff --git a/protocols/driver_diagnostics2.h b/protocols/driver_diagnostics2.h new file mode 100644 index 0000000..466c695 --- /dev/null +++ b/protocols/driver_diagnostics2.h @@ -0,0 +1,34 @@ +#ifndef EFI_PROTOCOLS_DRIVER_DIAGNOSTICS2_H +#define EFI_PROTOCOLS_DRIVER_DIAGNOSTICS2_H + +#define EFI_DRIVER_DIAGNOSTICS_PROTOCOL_GUID {0x4d330321,0x025f,0x4aac, {0x90,0xd8,0x5e,0xd9,0x00,0x17,0x3b,0x63}} + +typedef struct _EFI_DRIVER_DIAGNOSTICS2_PROTOCOL EFI_DRIVER_DIAGNOSTICS2_PROTOCOL; + +typedef enum { + EfiDriverDiagnosticTypeStandard = 0, + EfiDriverDiagnosticTypeExtended = 1, + EfiDriverDiagnosticTypeManufacturing = 2, + EfiDriverDiagnosticTypeCancel = 3, + EfiDriverDiagnosticTypeMaximum +} EFI_DRIVER_DIAGNOSTIC_TYPE; + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_DIAGNOSTICS2_RUN_DIAGNOSTICS)( + IN EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType, + IN CHAR8 *Language, + OUT EFI_GUID **ErrorType, + OUT UINTN *BufferSize, + OUT CHAR16 **Buffer +); + +typedef struct _EFI_DRIVER_DIAGNOSTICS2_PROTOCOL { + EFI_DRIVER_DIAGNOSTICS2_RUN_DIAGNOSTICS RunDiagnostics; + CHAR8 *SupportedLanguages; +} EFI_DRIVER_DIAGNOSTICS2_PROTOCOL; + +#endif /* EFI_PROTOCOLS_DRIVER_DIAGNOSTICS2_H */ diff --git a/protocols/driver_family_override.h b/protocols/driver_family_override.h new file mode 100644 index 0000000..1cbc767 --- /dev/null +++ b/protocols/driver_family_override.h @@ -0,0 +1,18 @@ +#ifndef EFI_PROTOCOLS_DRIVER_FAMILY_OVERRIDE_H +#define EFI_PROTOCOLS_DRIVER_FAMILY_OVERRIDE_H + +#define EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL_GUID {0xb1ee129e,0xda36,0x4181, {0x91,0xf8,0x04,0xa4,0x92,0x37,0x66,0xa7}} + +typedef struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL; + +typedef +UINT32 +(EFIAPI *EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION)( + IN EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL *This +); + +typedef struct _EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL { + EFI_DRIVER_FAMILY_OVERRIDE_GET_VERSION GetVersion; +} EFI_DRIVER_FAMILY_OVERRIDE_PROTOCOL; + +#endif /* EFI_PROTOCOLS_DRIVER_FAMILY_OVERRIDE_H */ diff --git a/protocols/driver_health.h b/protocols/driver_health.h new file mode 100644 index 0000000..e9c1ab6 --- /dev/null +++ b/protocols/driver_health.h @@ -0,0 +1,55 @@ +#ifndef EFI_PROTOCOLS_DRIVER_HEALTH_H +#define EFI_PROTOCOLS_DRIVER_HEALTH_H + +#define EFI_DRIVER_HEALTH_PROTOCOL_GUID {0x2a534210,0x9280,0x41d8, {0xae,0x79,0xca,0xda,0x01,0xa2,0xb1,0x27}} + +typedef struct _EFI_DRIVER_HEALTH_PROTOCOL EFI_DRIVER_HEALTH_PROTOCOL; + +typedef enum { + EfiDriverHealthStatusHealthy, + EfiDriverHealthStatusRepairRequired, + EfiDriverHealthStatusConfigurationRequired, + EfiDriverHealthStatusFailed, + EfiDriverHealthStatusReconnectRequired, + EfiDriverHealthStatusRebootRequired +} EFI_DRIVER_HEALTH_STATUS; + +typedef struct { + EFI_HII_HANDLE HiiHandle; + EFI_STRING_ID StringId; + UINT64 MessageCode; +} EFI_DRIVER_HEALTH_HII_MESSAGE; + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_HEALTH_GET_HEALTH_STATUS)( + IN EFI_DRIVER_HEALTH_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle OPTIONAL, + IN EFI_HANDLE ChildHandle OPTIONAL, + OUT EFI_DRIVER_HEALTH_STATUS *HealthStatus, + OUT EFI_DRIVER_HEALTH_HII_MESSAGE **MessageList OPTIONAL, + OUT EFI_HII_HANDLE *FormHiiHandle OPTIONAL +); + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_HEALTH_REPAIR_NOTIFY)( + IN UINTN Value, + IN UINTN Limit +); + +typedef +EFI_STATUS +(EFIAPI *EFI_DRIVER_HEALTH_REPAIR)( + IN EFI_DRIVER_HEALTH_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN EFI_DRIVER_HEALTH_REPAIR_NOTIFY RepairNotify OPTIONAL +); + +typedef struct _EFI_DRIVER_HEALTH_PROTOCOL { + EFI_DRIVER_HEALTH_GET_HEALTH_STATUS GetHealthStatus; + EFI_DRIVER_HEALTH_REPAIR Repair; +} EFI_DRIVER_HEALTH_PROTOCOL; + +#endif /* EFI_PROTOCOLS_DRIVER_HEALTH_H */ diff --git a/protocols/driver_supported_efi_version.h b/protocols/driver_supported_efi_version.h new file mode 100644 index 0000000..a0bc642 --- /dev/null +++ b/protocols/driver_supported_efi_version.h @@ -0,0 +1,13 @@ +#ifndef EFI_PROTOCOLS_DRIVER_SUPPORTED_EFI_VERSION_H +#define EFI_PROTOCOLS_DRIVER_SUPPORTED_EFI_VERSION_H + +#define EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL_GUID {0x5c198761,0x16a8,0x4e69, {0x97,0x2c,0x89,0xd6,0x79,0x54,0xf8,0x1d}} + +typedef struct _EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL; + +typedef struct _EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL { + UINT32 Length; + UINT32 FirmwareVersion; +} EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL; + +#endif /* EFI_PROTOCOLS_DRIVER_SUPPORTED_EFI_VERSION_H */ diff --git a/protocols/loaded_image.h b/protocols/loaded_image.h index b979d37..fad5134 100644 --- a/protocols/loaded_image.h +++ b/protocols/loaded_image.h @@ -5,6 +5,8 @@ #define EFI_LOADED_IMAGE_PROTOCOL_VERSION 0x1000 +typedef struct _EFI_LOADED_IMAGE_PROTOCOL EFI_LOADED_IMAGE_PROTOCOL; + typedef EFI_STATUS (EFIAPI *EFI_IMAGE_UNLOAD)( diff --git a/protocols/platform_to_driver_configuration.h b/protocols/platform_to_driver_configuration.h new file mode 100644 index 0000000..3e23859 --- /dev/null +++ b/protocols/platform_to_driver_configuration.h @@ -0,0 +1,59 @@ +#ifndef EFI_PROTOCOLS_PLATFORM_TO_DRIVER_CONFIGURATION_H +#define EFI_PROTOCOLS_PLATFORM_TO_DRIVER_CONFIGURATION_H + +#define EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL_GUID {0x642cd590,0x8059,0x4c0a, {0xa9,0x58,0xc5,0xec,0x07,0xd2,0x3c,0x4b}} +#define EFI_PLATFORM_TO_DRIVER_CONFIGURATION_CLP_GUID {0x345ecc0e,0xcb6,0x4b75, {0xbb,0x57,0x1b,0x12,0x9c,0x47,0x33,0x3e}} + +typedef struct _EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL; + +typedef enum { + EfiPlatformConfigurationActionNone = 0, + EfiPlatformConfigurationActionStopController = 1, + EfiPlatformConfigurationActionRestartController = 2, + EfiPlatformConfigurationActionRestartPlatform = 3, + EfiPlatformConfigurationActionNvramFailed = 4, + EfiPlatformConfigurationActionUnsupportedGuid = 5, + EfiPlatformConfigurationActionMaximum +} EFI_PLATFORM_CONFIGURATION_ACTION; + +typedef struct { + CHAR8 *CLPCommand; + UINT32 CLPCommandLength; + CHAR8 *CLPReturnString; + UINT32 CLPReturnStringLength; + UINT8 CLPCmdStatus; + UINT8 CLPErrorValue; + UINT16 CLPMsgCode; +} EFI_CONFIGURE_CLP_PARAMETER_BLK; + +typedef +EFI_STATUS +(EFIAPI *EFI_PLATFORM_TO_DRIVER_CONFIGURATION_QUERY)( + IN EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN UINTN *Instance, + OUT EFI_GUID **ParameterTypeGuid, + OUT VOID **ParameterBlock, + OUT UINTN *ParameterBlockSize +); + +typedef +EFI_STATUS +(EFIAPI *EFI_PLATFORM_TO_DRIVER_CONFIGURATION_RESPONSE)( + IN EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_HANDLE ChildHandle OPTIONAL, + IN UINTN *Instance, + IN EFI_GUID *ParameterTypeGuid, + IN VOID *ParameterBlock, + IN UINTN ParameterBlockSize, + IN EFI_PLATFORM_CONFIGURATION_ACTION ConfigurationAction +); + +typedef struct _EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL { + EFI_PLATFORM_TO_DRIVER_CONFIGURATION_QUERY Query; + EFI_PLATFORM_TO_DRIVER_CONFIGURATION_RESPONSE Response; +} EFI_PLATFORM_TO_DRIVER_CONFIGURATION_PROTOCOL; + +#endif /* EFI_PROTOCOLS_PLATFORM_TO_DRIVER_CONFIGURATION_H */ diff --git a/protocols/service_binding.h b/protocols/service_binding.h new file mode 100644 index 0000000..ed15cfa --- /dev/null +++ b/protocols/service_binding.h @@ -0,0 +1,25 @@ +#ifndef EFI_PROTOCOLS_SERVICE_BINDING_H +#define EFI_PROTOCOLS_SERVICE_BINDING_H + +typedef struct _EFI_SERVICE_BINDING_PROTOCOL EFI_SERVICE_BINDING_PROTOCOL; + +typedef +EFI_STATUS +(EFIAPI *EFI_SERVICE_BINDING_CREATE_CHILD)( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN OUT EFI_HANDLE *ChildHandle +); + +typedef +EFI_STATUS +(EFIAPI *EFI_SERVICE_BINDING_DESTROY_CHILD)( + IN EFI_SERVICE_BINDING_PROTOCOL *This, + IN EFI_HANDLE ChildHandle +); + +typedef struct _EFI_SERVICE_BINDING_PROTOCOL { + EFI_SERVICE_BINDING_CREATE_CHILD CreateChild; + EFI_SERVICE_BINDING_DESTROY_CHILD DestroyChild; +} EFI_SERVICE_BINDING_PROTOCOL; + +#endif /* EFI_PROTOCOLS_SERVICE_BINDING_H */