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

Alexander Graf
2017-07-25T08:52:41Z

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@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