diff --git a/src/include/ipxe/efi/efi.h b/src/include/ipxe/efi/efi.h index a98b5588..05576f9d 100644 --- a/src/include/ipxe/efi/efi.h +++ b/src/include/ipxe/efi/efi.h @@ -59,6 +59,8 @@ struct efi_protocol { EFI_GUID guid; /** Variable containing pointer to protocol structure */ void **protocol; + /** Protocol is required */ + int required; }; /** EFI protocol table */ @@ -78,6 +80,21 @@ struct efi_protocol { .protocol = ( ( void ** ) ( void * ) \ ( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ? \ (_ptr) : (_ptr) ) ), \ + .required = 1, \ + } + +/** Declare an EFI protocol to be requested by iPXE + * + * @v _protocol EFI protocol name + * @v _ptr Pointer to protocol instance + */ +#define EFI_REQUEST_PROTOCOL( _protocol, _ptr ) \ + struct efi_protocol __ ## _protocol __efi_protocol = { \ + .guid = _protocol ## _GUID, \ + .protocol = ( ( void ** ) ( void * ) \ + ( ( (_ptr) == ( ( _protocol ** ) (_ptr) ) ) ? \ + (_ptr) : (_ptr) ) ), \ + .required = 0, \ } /** An EFI configuration table used by iPXE */ diff --git a/src/interface/efi/efi_init.c b/src/interface/efi/efi_init.c index b4ed5c14..e6ef3d05 100644 --- a/src/interface/efi/efi_init.c +++ b/src/interface/efi/efi_init.c @@ -187,8 +187,9 @@ EFI_STATUS efi_init ( EFI_HANDLE image_handle, } else { DBGC ( systab, "EFI does not provide protocol %s\n", efi_guid_ntoa ( &prot->guid ) ); - /* All protocols are required */ - return efirc; + /* Fail if protocol is required */ + if ( prot->required ) + return efirc; } }