[U-Boot] [PATCH] efi_loader: add back optional efi_handler::open()

Alexander Graf agraf at suse.de
Tue Jul 25 08:52:41 UTC 2017



On 24.07.17 16:38, Rob Clark wrote:
> In some cases it is useful to defer creation of the protocol interface
> object.  So add back an optional ->open() hook that is used if
> protcol_interface is NULL.
> 
> I've slightly simplified the fxn ptr signature to remove unneeded args,
> and so compiler will complain if patches that used the "old way" are,
> and which do not need this extra complexity, are rebased.
> 
> Signed-off-by: Rob Clark <robdclark at gmail.com>
> ---
>   include/efi_loader.h          | 9 ++++++++-
>   lib/efi_loader/efi_boottime.c | 7 +++++++
>   2 files changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/include/efi_loader.h b/include/efi_loader.h
> index 90411cdbab..3da0477fdc 100644
> --- a/include/efi_loader.h
> +++ b/include/efi_loader.h
> @@ -41,10 +41,17 @@ extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
>   /*
>    * When the UEFI payload wants to open a protocol on an object to get its
>    * interface (usually a struct with callback functions), this struct maps the
> - * protocol GUID to the respective protocol interface */
> + * protocol GUID to the respective protocol interface.
> + *
> + * The optional ->open() fxn can be used for cases where the protocol
> + * interface is constructed on-demand, and is called if protocol_interface
> + * is NULL.
> + */
>   struct efi_handler {
>   	const efi_guid_t *guid;
>   	void *protocol_interface;
> +	efi_status_t (EFIAPI *open)(void *handle, efi_guid_t *protocol,
> +			void **protocol_interface);
>   };
>   
>   /*
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index 7d45c18ff7..21f41866d0 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1063,6 +1063,13 @@ static efi_status_t EFIAPI efi_open_protocol(
>   			if (!guidcmp(hprotocol, protocol)) {
>   				if (attributes !=
>   				    EFI_OPEN_PROTOCOL_TEST_PROTOCOL) {
> +					if (!handler->protocol_interface) {
> +						r = handler->open(efiobj->handle,
> +								protocol,
> +								&handler->protocol_interface);

With this patch you basically allow deferred setting of 
handler->protocol_interface. I think that's a reasonable thing to do, 
but we have to be careful not to break UEFI assumptions.

For example efi_locate_protocol reads handler->protocol_interface, so 
that needs adjustment I suppose.


Alex


More information about the U-Boot mailing list