mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-08 19:11:53 +00:00
efi_loader: refactor efi_open_protocol
efi_open_protocol was implemented to call a protocol specific open function to retrieve the protocol interface. The UEFI specification does not know of such a function. It is not possible to implement InstallProtocolInterface with the current design. With the patch the protocol interface itself is stored in the list of installed protocols of an efi_object instead of an open function. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> [agraf: fix efi gop support] Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
8d3a25685e
commit
b5349f742a
7 changed files with 26 additions and 92 deletions
|
@ -35,29 +35,6 @@ struct efi_disk_obj {
|
|||
const struct blk_desc *desc;
|
||||
};
|
||||
|
||||
static efi_status_t EFIAPI efi_disk_open_block(void *handle,
|
||||
efi_guid_t *protocol, void **protocol_interface,
|
||||
void *agent_handle, void *controller_handle,
|
||||
uint32_t attributes)
|
||||
{
|
||||
struct efi_disk_obj *diskobj = handle;
|
||||
|
||||
*protocol_interface = &diskobj->ops;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
static efi_status_t EFIAPI efi_disk_open_dp(void *handle, efi_guid_t *protocol,
|
||||
void **protocol_interface, void *agent_handle,
|
||||
void *controller_handle, uint32_t attributes)
|
||||
{
|
||||
struct efi_disk_obj *diskobj = handle;
|
||||
|
||||
*protocol_interface = diskobj->dp;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
static efi_status_t EFIAPI efi_disk_reset(struct efi_block_io *this,
|
||||
char extended_verification)
|
||||
{
|
||||
|
@ -210,10 +187,11 @@ static void efi_disk_add_dev(const char *name,
|
|||
diskobj = calloc(1, objlen);
|
||||
|
||||
/* Fill in object data */
|
||||
dp = (void *)&diskobj[1];
|
||||
diskobj->parent.protocols[0].guid = &efi_block_io_guid;
|
||||
diskobj->parent.protocols[0].open = efi_disk_open_block;
|
||||
diskobj->parent.protocols[0].protocol_interface = &diskobj->ops;
|
||||
diskobj->parent.protocols[1].guid = &efi_guid_device_path;
|
||||
diskobj->parent.protocols[1].open = efi_disk_open_dp;
|
||||
diskobj->parent.protocols[1].protocol_interface = dp;
|
||||
diskobj->parent.handle = diskobj;
|
||||
diskobj->ops = block_io_disk_template;
|
||||
diskobj->ifname = if_typename;
|
||||
|
@ -230,7 +208,6 @@ static void efi_disk_add_dev(const char *name,
|
|||
diskobj->ops.media = &diskobj->media;
|
||||
|
||||
/* Fill in device path */
|
||||
dp = (void*)&diskobj[1];
|
||||
diskobj->dp = dp;
|
||||
dp[0].dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
|
||||
dp[0].dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue