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

Heinrich Schuchardt xypron.glpk at gmx.de
Fri Sep 15 06:35:51 UTC 2017


On 08/31/2017 02:52 PM, Simon Glass wrote:
> 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?

Hello Simon,

the API functions (here DisconnectController) are documented in the UEFI
spec. Is your idea that we should duplicate part of this information for
all API functions? Or do you miss a comment on implementation details?

> 
>>  {
>> +       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.
> 

In different places the EFI API requires a bitness dependent unsigned
integer.

Shall we globally rename UINTN to uintn?
This is my patch to blame:
503f2695548 (efi_loader: correct size for tpl level)

Regards

Heinrich

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