mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2025-12-16 15:02:16 +01:00
efi_loader: list of open protocol infos
Add a list of open protocol infos to each protocol of a handle. Provide helper functions to access the list items. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
5be9744ae7
commit
fe1599daf5
@ -96,15 +96,28 @@ extern const efi_guid_t efi_file_info_guid;
|
|||||||
extern unsigned int __efi_runtime_start, __efi_runtime_stop;
|
extern unsigned int __efi_runtime_start, __efi_runtime_stop;
|
||||||
extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
|
extern unsigned int __efi_runtime_rel_start, __efi_runtime_rel_stop;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When a protocol is opened a open protocol info entry is created.
|
||||||
|
* These are maintained in a list.
|
||||||
|
*/
|
||||||
|
struct efi_open_protocol_info_item {
|
||||||
|
/* Link to the list of open protocol info entries of a protocol */
|
||||||
|
struct list_head link;
|
||||||
|
struct efi_open_protocol_info_entry info;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When the UEFI payload wants to open a protocol on an object to get its
|
* 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
|
* 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
|
||||||
|
*/
|
||||||
struct efi_handler {
|
struct efi_handler {
|
||||||
/* Link to the list of protocols of a handle */
|
/* Link to the list of protocols of a handle */
|
||||||
struct list_head link;
|
struct list_head link;
|
||||||
const efi_guid_t *guid;
|
const efi_guid_t *guid;
|
||||||
void *protocol_interface;
|
void *protocol_interface;
|
||||||
|
/* Link to the list of open protocol info items */
|
||||||
|
struct list_head open_infos;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -814,6 +814,40 @@ struct efi_object *efi_search_obj(const void *handle)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create open protocol info entry and add it to a protocol.
|
||||||
|
*
|
||||||
|
* @handler handler of a protocol
|
||||||
|
* @return open protocol info entry
|
||||||
|
*/
|
||||||
|
static struct efi_open_protocol_info_entry *efi_create_open_info(
|
||||||
|
struct efi_handler *handler)
|
||||||
|
{
|
||||||
|
struct efi_open_protocol_info_item *item;
|
||||||
|
|
||||||
|
item = calloc(1, sizeof(struct efi_open_protocol_info_item));
|
||||||
|
if (!item)
|
||||||
|
return NULL;
|
||||||
|
/* Append the item to the open protocol info list. */
|
||||||
|
list_add_tail(&item->link, &handler->open_infos);
|
||||||
|
|
||||||
|
return &item->info;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove an open protocol info entry from a protocol.
|
||||||
|
*
|
||||||
|
* @handler handler of a protocol
|
||||||
|
* @return status code
|
||||||
|
*/
|
||||||
|
static efi_status_t efi_delete_open_info(
|
||||||
|
struct efi_open_protocol_info_item *item)
|
||||||
|
{
|
||||||
|
list_del(&item->link);
|
||||||
|
free(item);
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Install new protocol on a handle.
|
* Install new protocol on a handle.
|
||||||
*
|
*
|
||||||
@ -840,6 +874,7 @@ efi_status_t efi_add_protocol(const void *handle, const efi_guid_t *protocol,
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
handler->guid = protocol;
|
handler->guid = protocol;
|
||||||
handler->protocol_interface = protocol_interface;
|
handler->protocol_interface = protocol_interface;
|
||||||
|
INIT_LIST_HEAD(&handler->open_infos);
|
||||||
list_add_tail(&handler->link, &efiobj->protocols);
|
list_add_tail(&handler->link, &efiobj->protocols);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user