Re: [U-Boot] [PATCH 12/23] efi_loader: implement OpenProtocolInformation

2017-08-31 Thread Heinrich Schuchardt
On 08/31/2017 02:51 PM, Simon Glass wrote:
> Hi Heinrich,
> 
> On 27 August 2017 at 06:53, Heinrich Schuchardt  wrote:
>> efi_open_protocol_information provides the agent and controller
>> handles as well as the attributes and open count of an protocol
>> on a handle.
>>
>> Cc: Rob Clark 
>> Signed-off-by: Heinrich Schuchardt 
>> ---
>>  lib/efi_loader/efi_boottime.c | 55 
>> ++-
>>  1 file changed, 54 insertions(+), 1 deletion(-)
> 
> Reviewed-by: Simon Glass 
> 
> I can't help wondering if this would be better as a linked list?

This is an API function. The interface of the function has to be kept
the way it is.

Internally we could use other storage models.

Best regards

Heinrich

> 
>>
>> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
>> index c9aec597a2..23b8894e73 100644
>> --- a/lib/efi_loader/efi_boottime.c
>> +++ b/lib/efi_loader/efi_boottime.c
>> @@ -985,9 +985,62 @@ static efi_status_t EFIAPI 
>> efi_open_protocol_information(efi_handle_t handle,
>> struct efi_open_protocol_info_entry **entry_buffer,
>> unsigned long *entry_count)
>>  {
>> +   unsigned long buffer_size;
>> +   unsigned long count;
>> +   struct efi_handler *handler;
>> +   size_t i;
>> +   efi_status_t r;
>> +
>> EFI_ENTRY("%p, %p, %p, %p", handle, protocol, entry_buffer,
>>   entry_count);
>> -   return EFI_EXIT(EFI_NOT_FOUND);
>> +
>> +   /* Check parameters */
>> +   if (!handle || !protocol || !entry_buffer) {
>> +   r = EFI_INVALID_PARAMETER;
>> +   goto out;
>> +   }
>> +
>> +   /* Find the protocol */
>> +   r = efi_search_protocol(handle, protocol, &handler);
>> +   if (r != EFI_SUCCESS)
>> +   goto out;
>> +
>> +   *entry_buffer = NULL;
>> +
>> +   /* Count entries */
>> +   count = 0;
>> +   for (i = 0; i < ARRAY_SIZE(handler->open_info); ++i) {
>> +   struct efi_open_protocol_info_entry *open_info =
>> +   &handler->open_info[i];
>> +
>> +   if (open_info->open_count)
>> +   ++count;
>> +   }
>> +   *entry_count = count;
>> +   if (!count) {
>> +   r = EFI_SUCCESS;
>> +   goto out;
>> +   }
>> +
>> +   /* Copy entries */
>> +   buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
>> +   r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
>> + (void **)entry_buffer);
>> +   if (r != EFI_SUCCESS)
>> +   goto out;
>> +   count = 0;
>> +   for (i = 0; i < ARRAY_SIZE(handler->open_info); ++i) {
>> +   struct efi_open_protocol_info_entry *open_info =
>> +   &handler->open_info[i];
>> +
>> +   if (!open_info->open_count)
>> +   continue;
>> +   (*entry_buffer)[count] = *open_info;
>> +   ++count;
>> +   }
>> +
>> +out:
>> +   return EFI_EXIT(r);
>>  }
>>
>>  static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
>> --
>> 2.14.1
>>
> 

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH 12/23] efi_loader: implement OpenProtocolInformation

2017-08-31 Thread Simon Glass
Hi Heinrich,

On 27 August 2017 at 06:53, Heinrich Schuchardt  wrote:
> efi_open_protocol_information provides the agent and controller
> handles as well as the attributes and open count of an protocol
> on a handle.
>
> Cc: Rob Clark 
> Signed-off-by: Heinrich Schuchardt 
> ---
>  lib/efi_loader/efi_boottime.c | 55 
> ++-
>  1 file changed, 54 insertions(+), 1 deletion(-)

Reviewed-by: Simon Glass 

I can't help wondering if this would be better as a linked list?

>
> diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
> index c9aec597a2..23b8894e73 100644
> --- a/lib/efi_loader/efi_boottime.c
> +++ b/lib/efi_loader/efi_boottime.c
> @@ -985,9 +985,62 @@ static efi_status_t EFIAPI 
> efi_open_protocol_information(efi_handle_t handle,
> struct efi_open_protocol_info_entry **entry_buffer,
> unsigned long *entry_count)
>  {
> +   unsigned long buffer_size;
> +   unsigned long count;
> +   struct efi_handler *handler;
> +   size_t i;
> +   efi_status_t r;
> +
> EFI_ENTRY("%p, %p, %p, %p", handle, protocol, entry_buffer,
>   entry_count);
> -   return EFI_EXIT(EFI_NOT_FOUND);
> +
> +   /* Check parameters */
> +   if (!handle || !protocol || !entry_buffer) {
> +   r = EFI_INVALID_PARAMETER;
> +   goto out;
> +   }
> +
> +   /* Find the protocol */
> +   r = efi_search_protocol(handle, protocol, &handler);
> +   if (r != EFI_SUCCESS)
> +   goto out;
> +
> +   *entry_buffer = NULL;
> +
> +   /* Count entries */
> +   count = 0;
> +   for (i = 0; i < ARRAY_SIZE(handler->open_info); ++i) {
> +   struct efi_open_protocol_info_entry *open_info =
> +   &handler->open_info[i];
> +
> +   if (open_info->open_count)
> +   ++count;
> +   }
> +   *entry_count = count;
> +   if (!count) {
> +   r = EFI_SUCCESS;
> +   goto out;
> +   }
> +
> +   /* Copy entries */
> +   buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
> +   r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
> + (void **)entry_buffer);
> +   if (r != EFI_SUCCESS)
> +   goto out;
> +   count = 0;
> +   for (i = 0; i < ARRAY_SIZE(handler->open_info); ++i) {
> +   struct efi_open_protocol_info_entry *open_info =
> +   &handler->open_info[i];
> +
> +   if (!open_info->open_count)
> +   continue;
> +   (*entry_buffer)[count] = *open_info;
> +   ++count;
> +   }
> +
> +out:
> +   return EFI_EXIT(r);
>  }
>
>  static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
> --
> 2.14.1
>
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH 12/23] efi_loader: implement OpenProtocolInformation

2017-08-26 Thread Heinrich Schuchardt
efi_open_protocol_information provides the agent and controller
handles as well as the attributes and open count of an protocol
on a handle.

Cc: Rob Clark 
Signed-off-by: Heinrich Schuchardt 
---
 lib/efi_loader/efi_boottime.c | 55 ++-
 1 file changed, 54 insertions(+), 1 deletion(-)

diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
index c9aec597a2..23b8894e73 100644
--- a/lib/efi_loader/efi_boottime.c
+++ b/lib/efi_loader/efi_boottime.c
@@ -985,9 +985,62 @@ static efi_status_t EFIAPI 
efi_open_protocol_information(efi_handle_t handle,
struct efi_open_protocol_info_entry **entry_buffer,
unsigned long *entry_count)
 {
+   unsigned long buffer_size;
+   unsigned long count;
+   struct efi_handler *handler;
+   size_t i;
+   efi_status_t r;
+
EFI_ENTRY("%p, %p, %p, %p", handle, protocol, entry_buffer,
  entry_count);
-   return EFI_EXIT(EFI_NOT_FOUND);
+
+   /* Check parameters */
+   if (!handle || !protocol || !entry_buffer) {
+   r = EFI_INVALID_PARAMETER;
+   goto out;
+   }
+
+   /* Find the protocol */
+   r = efi_search_protocol(handle, protocol, &handler);
+   if (r != EFI_SUCCESS)
+   goto out;
+
+   *entry_buffer = NULL;
+
+   /* Count entries */
+   count = 0;
+   for (i = 0; i < ARRAY_SIZE(handler->open_info); ++i) {
+   struct efi_open_protocol_info_entry *open_info =
+   &handler->open_info[i];
+
+   if (open_info->open_count)
+   ++count;
+   }
+   *entry_count = count;
+   if (!count) {
+   r = EFI_SUCCESS;
+   goto out;
+   }
+
+   /* Copy entries */
+   buffer_size = count * sizeof(struct efi_open_protocol_info_entry);
+   r = efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, buffer_size,
+ (void **)entry_buffer);
+   if (r != EFI_SUCCESS)
+   goto out;
+   count = 0;
+   for (i = 0; i < ARRAY_SIZE(handler->open_info); ++i) {
+   struct efi_open_protocol_info_entry *open_info =
+   &handler->open_info[i];
+
+   if (!open_info->open_count)
+   continue;
+   (*entry_buffer)[count] = *open_info;
+   ++count;
+   }
+
+out:
+   return EFI_EXIT(r);
 }
 
 static efi_status_t EFIAPI efi_protocols_per_handle(void *handle,
-- 
2.14.1

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot