[U-Boot] [PATCH 16/23] efi_loader: implement DisconnectController

Simon Glass sjg at chromium.org
Thu Aug 31 12:52:04 UTC 2017


On 27 August 2017 at 06:53, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
> Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> ---
>  lib/efi_loader/efi_boottime.c | 77 ++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 76 insertions(+), 1 deletion(-)
>
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index 1069da7d79..c5a17b6252 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -1052,9 +1052,84 @@ static efi_status_t EFIAPI efi_disconnect_controller(void *controller_handle,
>                                                      void *driver_image_handle,
>                                                      void *child_handle)

Can you add a function comment?

>  {
> +       struct efi_driver_binding_protocol *binding_protocol;
> +       efi_handle_t child_handle_buffer;
> +       unsigned long driver_count;
> +       efi_handle_t *driver_handle_buffer;
> +       size_t i;
> +       UINTN number_of_children;

Can we somehow use a lower-case type for this? Otherwise U-Boot will
start to look like EFI and I will have to start taking
antidepressants.

> +       efi_status_t r;
> +       size_t stop_count = 0;
> +
>         EFI_ENTRY("%p, %p, %p", controller_handle, driver_image_handle,
>                   child_handle);
> -       return EFI_EXIT(EFI_INVALID_PARAMETER);
> +
> +       if (!efi_search_obj(controller_handle)) {
> +               r = EFI_INVALID_PARAMETER;
> +               goto out;
> +       }
> +
> +       /* Create list of driver handles */
> +       if (driver_image_handle) {
> +               driver_handle_buffer = &driver_image_handle,
> +               driver_count = 1;
> +               /* Check that the handle supports driver binding protocol */
> +               r = efi_search_protocol(driver_image_handle,
> +                                       &efi_guid_driver_binding_protocol,
> +                                       NULL);
> +       } else {
> +               /* Get buffer with all handles with driver binding protocol */
> +               r = EFI_CALL(efi_locate_handle_buffer(
> +                            by_protocol, &efi_guid_driver_binding_protocol,
> +                            NULL, &driver_count, &driver_handle_buffer));
> +       }
> +       if (r != EFI_SUCCESS)
> +               goto out;
> +
> +       /* Create list of child handles */
> +       if (child_handle) {
> +               number_of_children = 1;
> +               child_handle_buffer = &child_handle;
> +       } else {
> +               /*
> +                * We do not fully support child handles.
> +                *
> +                * It is unclear from which handle and which protocols the
> +                * list of child controllers should be collected.
> +                */
> +               number_of_children = 0;
> +               child_handle_buffer = NULL;
> +       }
> +
> +       for (i = 0; i < driver_count; ++i) {
> +               r = EFI_CALL(efi_open_protocol(
> +                            driver_handle_buffer[i],
> +                            &efi_guid_driver_binding_protocol,
> +                            (void **)&binding_protocol,
> +                            driver_handle_buffer[i], NULL,
> +                            EFI_OPEN_PROTOCOL_GET_PROTOCOL));
> +               if (r != EFI_SUCCESS)
> +                       continue;
> +
> +               r = EFI_CALL(binding_protocol->stop(binding_protocol,
> +                                                   controller_handle,
> +                                                   number_of_children,
> +                                                   child_handle_buffer));
> +               if (r == EFI_SUCCESS)
> +                       ++stop_count;
> +               EFI_CALL(efi_close_protocol(driver_handle_buffer[i],
> +                                           &efi_guid_driver_binding_protocol,
> +                                           driver_handle_buffer[i], NULL));
> +       }
> +
> +       if (driver_image_handle)
> +               efi_free_pool(driver_handle_buffer);
> +       if (stop_count)
> +               r = EFI_SUCCESS;
> +       else
> +               r = EFI_NOT_FOUND;
> +out:
> +       return EFI_EXIT(r);
>  }
>
>  efi_status_t EFIAPI efi_close_protocol(void *handle, const efi_guid_t *protocol,
> --
> 2.14.1
>


More information about the U-Boot mailing list