efi_driver: add init function to EFI block driver

For handling added and removed block devices we need to register events
which has to be done when the driver is installed.

This patch only creates an empty init function that will be filled with
code later on. The function needs to be called before any EFI block devices
are used. Move the efi_driver_init() call to early init.

Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
This commit is contained in:
Heinrich Schuchardt 2022-10-05 11:28:47 +02:00
parent ec4f675f9e
commit 8f8fe1d458
4 changed files with 32 additions and 10 deletions

View File

@ -32,12 +32,15 @@ struct efi_driver_binding_extended_protocol {
* EFI_DRIVER_BINDING_PROTOCOL. * EFI_DRIVER_BINDING_PROTOCOL.
* @child_protocol: Protocol supported by the child handles generated by * @child_protocol: Protocol supported by the child handles generated by
* the EFI driver. * the EFI driver.
* @init: Function called by the EFI uclass after installing the
* driver binding protocol.
* @bind: Function called by the EFI uclass to attach the * @bind: Function called by the EFI uclass to attach the
* driver to EFI driver to a handle. * driver to EFI driver to a handle.
*/ */
struct efi_driver_ops { struct efi_driver_ops {
const efi_guid_t *protocol; const efi_guid_t *protocol;
const efi_guid_t *child_protocol; const efi_guid_t *child_protocol;
efi_status_t (*init)(struct efi_driver_binding_extended_protocol *this);
efi_status_t (*bind)(struct efi_driver_binding_extended_protocol *this, efi_status_t (*bind)(struct efi_driver_binding_extended_protocol *this,
efi_handle_t handle, void *interface); efi_handle_t handle, void *interface);
}; };

View File

@ -197,6 +197,17 @@ static efi_status_t efi_bl_bind(
return ret; return ret;
} }
/**
* efi_bl_init() - initialize block device driver
*
* @this: extended driver binding protocol
*/
static efi_status_t
efi_bl_init(struct efi_driver_binding_extended_protocol *this)
{
return EFI_SUCCESS;
}
/* Block device driver operators */ /* Block device driver operators */
static const struct blk_ops efi_blk_ops = { static const struct blk_ops efi_blk_ops = {
.read = efi_bl_read, .read = efi_bl_read,
@ -215,6 +226,7 @@ U_BOOT_DRIVER(efi_blk) = {
static const struct efi_driver_ops driver_ops = { static const struct efi_driver_ops driver_ops = {
.protocol = &efi_block_io_guid, .protocol = &efi_block_io_guid,
.child_protocol = &efi_block_io_guid, .child_protocol = &efi_block_io_guid,
.init = efi_bl_init,
.bind = efi_bl_bind, .bind = efi_bl_bind,
}; };

View File

@ -284,7 +284,7 @@ static efi_status_t efi_add_driver(struct driver *drv)
bp->bp.start = efi_uc_start; bp->bp.start = efi_uc_start;
bp->bp.stop = efi_uc_stop; bp->bp.stop = efi_uc_stop;
bp->bp.version = 0xffffffff; bp->bp.version = 0xffffffff;
bp->ops = drv->ops; bp->ops = ops;
ret = efi_create_handle(&bp->bp.driver_binding_handle); ret = efi_create_handle(&bp->bp.driver_binding_handle);
if (ret != EFI_SUCCESS) { if (ret != EFI_SUCCESS) {
@ -294,13 +294,20 @@ static efi_status_t efi_add_driver(struct driver *drv)
bp->bp.image_handle = bp->bp.driver_binding_handle; bp->bp.image_handle = bp->bp.driver_binding_handle;
ret = efi_add_protocol(bp->bp.driver_binding_handle, ret = efi_add_protocol(bp->bp.driver_binding_handle,
&efi_guid_driver_binding_protocol, bp); &efi_guid_driver_binding_protocol, bp);
if (ret != EFI_SUCCESS) { if (ret != EFI_SUCCESS)
efi_delete_handle(bp->bp.driver_binding_handle); goto err;
free(bp); if (ops->init) {
goto out; ret = ops->init(bp);
if (ret != EFI_SUCCESS)
goto err;
} }
out: out:
return ret; return ret;
err:
efi_delete_handle(bp->bp.driver_binding_handle);
free(bp);
return ret;
} }
/** /**

View File

@ -198,6 +198,11 @@ static efi_status_t __efi_init_early(void)
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
/* Initialize EFI driver uclass */
ret = efi_driver_init();
if (ret != EFI_SUCCESS)
goto out;
ret = efi_disk_init(); ret = efi_disk_init();
out: out:
return ret; return ret;
@ -319,11 +324,6 @@ efi_status_t efi_init_obj_list(void)
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)
goto out; goto out;
/* Initialize EFI driver uclass */
ret = efi_driver_init();
if (ret != EFI_SUCCESS)
goto out;
if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)) { if (IS_ENABLED(CONFIG_EFI_HAVE_CAPSULE_SUPPORT)) {
ret = efi_load_capsule_drivers(); ret = efi_load_capsule_drivers();
if (ret != EFI_SUCCESS) if (ret != EFI_SUCCESS)