All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heinrich Schuchardt <xypron.glpk@gmx.de>
To: Simon Glass <sjg@chromium.org>
Cc: Ilias Apalodimas <ilias.apalodimas@linaro.org>,
	Bin Meng <bmeng.cn@gmail.com>, Tom Rini <trini@konsulko.com>,
	Christian Melki <christian.melki@t2data.com>,
	Alexander Graf <agraf@csgraf.de>,
	U-Boot Mailing List <u-boot@lists.denx.de>
Subject: Re: [PATCH 13/35] efi: Add a media/block driver for EFI block devices
Date: Wed, 8 Sep 2021 19:59:08 +0200	[thread overview]
Message-ID: <21126ea8-9842-49fd-c01d-6408b5a28218@gmx.de> (raw)
In-Reply-To: <20210908073355.13.I9b48fe5f6b8c61348f16a1b5df114282240238c0@changeid>



On 9/8/21 3:33 PM, Simon Glass wrote:
> Add a block driver which handles read/write for EFI block devices. This
> driver actually already exists ('efi_block') but is not really suitable
> for use as a real U-Boot driver:
>
> - The operations do not provide a udevice

efi_bl_bind() creates a udevice by calling blk_create_device() when an
EFI application calls ConnectController() for a handle with an
EFI_BLOCK_IO_PROTOCOL.

Please, explain in some detail what you think is wrong with the existing
code.

> - The code is designed for running as part of EFI loader, so uses
>      EFI_PRINT() and EFI_CALL().
> - It creates block devices for all the partitions too, which is not
>    somthing we want to support in this way
> - The bind method probes the device, which is not permitted
> - It uses 'EFI' as its parent device
>
> The new driver is more 'normal', just requiring its platform data be set
> up in advance.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>

Please, separate this series in two. One for U-Boot on EFI and one for
U-Boot's UEFI implementation.

Best regardss

Heinrich

> ---
>
>   drivers/block/Kconfig   |  10 ++++
>   drivers/block/Makefile  |   1 +
>   drivers/block/efi_blk.c | 115 ++++++++++++++++++++++++++++++++++++++++
>   include/efi.h           |  11 ++++
>   4 files changed, 137 insertions(+)
>   create mode 100644 drivers/block/efi_blk.c
>
> diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
> index 058956ee8ee..ab450a52e9e 100644
> --- a/drivers/block/Kconfig
> +++ b/drivers/block/Kconfig
> @@ -84,6 +84,16 @@ config EFI_MEDIA_SANDBOX
>   	  EFI_MEDIA uclass. It does not do anything useful, since sandbox does
>   	  not actually support running on top of UEFI.
>
> +config EFI_MEDIA_BLK
> +	bool "EFI media block driver"
> +	depends on EFI_APP
> +	default y
> +	help
> +	  Enables a block driver for providing access to UEFI devices. This
> +	  allows use of block devices detected by the underlying UEFI
> +	  implementation. With this it is possible to use filesystems on these
> +	  devices, for example.
> +
>   endif  # EFI_MEDIA
>
>   config IDE
> diff --git a/drivers/block/Makefile b/drivers/block/Makefile
> index 3778633da1d..b221a7c6eea 100644
> --- a/drivers/block/Makefile
> +++ b/drivers/block/Makefile
> @@ -17,3 +17,4 @@ obj-$(CONFIG_$(SPL_TPL_)BLOCK_CACHE) += blkcache.o
>
>   obj-$(CONFIG_EFI_MEDIA) += efi-media-uclass.o
>   obj-$(CONFIG_EFI_MEDIA_SANDBOX) += sb_efi_media.o
> +obj-$(CONFIG_EFI_MEDIA_BLK) += efi_blk.o
> diff --git a/drivers/block/efi_blk.c b/drivers/block/efi_blk.c
> new file mode 100644
> index 00000000000..c00b0cc0b1c
> --- /dev/null
> +++ b/drivers/block/efi_blk.c
> @@ -0,0 +1,115 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Block driver for EFI devices
> + * This supports a media driver of UCLASS_EFI with a child UCLASS_BLK
> + * It allows block-level access to EFI devices made available via EFI boot
> + * services
> + *
> + * Copyright 2021 Google LLC
> + */
> +
> +#include <common.h>
> +#include <blk.h>
> +#include <dm.h>
> +#include <efi.h>
> +#include <efi_api.h>
> +
> +struct efi_block_plat {
> +	struct efi_block_io *blkio;
> +};
> +
> +/**
> + * Read from block device
> + *
> + * @dev:	device
> + * @blknr:	first block to be read
> + * @blkcnt:	number of blocks to read
> + * @buffer:	output buffer
> + * Return:	number of blocks transferred
> + */
> +static ulong efi_bl_read(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
> +			 void *buffer)
> +{
> +	struct efi_block_plat *plat = dev_get_plat(dev);
> +	struct efi_block_io *io = plat->blkio;
> +	efi_status_t ret;
> +
> +	log_debug("read buf=%p, block=%lx, count=%lx: ", buffer, (ulong)blknr,
> +		  (ulong)blkcnt);
> +	ret = io->read_blocks(io, io->media->media_id, blknr,
> +			      blkcnt * io->media->block_size, buffer);
> +	log_debug("ret=%lx (dec %ld)\n", ret & ~EFI_ERROR_MASK,
> +		  ret & ~EFI_ERROR_MASK);
> +	if (ret)
> +		return 0;
> +
> +	return blkcnt;
> +}
> +
> +/**
> + * Write to block device
> + *
> + * @dev:	device
> + * @blknr:	first block to be write
> + * @blkcnt:	number of blocks to write
> + * @buffer:	input buffer
> + * Return:	number of blocks transferred
> + */
> +static ulong efi_bl_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt,
> +			  const void *buffer)
> +{
> +	struct efi_block_plat *plat = dev_get_plat(dev);
> +	struct efi_block_io *io = plat->blkio;
> +	efi_status_t ret;
> +
> +	log_debug("write buf=%p, block=%lx, count=%lx: ", buffer, (ulong)blknr,
> +		  (ulong)blkcnt);
> +	ret = io->write_blocks(io, io->media->media_id, blknr,
> +			       blkcnt * io->media->block_size, (void *)buffer);
> +	log_debug("ret=%lx (dec %ld)\n", ret & ~EFI_ERROR_MASK,
> +		  ret & ~EFI_ERROR_MASK);
> +	if (ret)
> +		return 0;
> +
> +	return blkcnt;
> +}
> +
> +/* Block device driver operators */
> +static const struct blk_ops efi_blk_ops = {
> +	.read	= efi_bl_read,
> +	.write	= efi_bl_write,
> +};
> +
> +U_BOOT_DRIVER(efi_block) = {
> +	.name		= "efi_block",
> +	.id		= UCLASS_BLK,
> +	.ops		= &efi_blk_ops,
> +	.plat_auto	= sizeof(struct efi_block_plat),
> +};
> +
> +static int efi_media_bind(struct udevice *dev)
> +{
> +	struct efi_media_plat *plat = dev_get_plat(dev);
> +	struct efi_block_plat *blk_plat;
> +	struct udevice *blk;
> +	int ret;
> +
> +	ret = blk_create_devicef(dev, "efi_block", "blk", IF_TYPE_EFI,
> +				 dev_seq(dev), plat->blkio->media->block_size,
> +				 plat->blkio->media->last_block, &blk);
> +	if (ret) {
> +		debug("Cannot create block device\n");
> +		return ret;
> +	}
> +	blk_plat = dev_get_plat(blk);
> +	blk_plat->blkio = plat->blkio;
> +
> +	return 0;
> +}
> +
> +U_BOOT_DRIVER(efi_media) = {
> +	.name		= "efi_media",
> +	.id		= UCLASS_EFI_MEDIA,
> +	.bind		= efi_media_bind,
> +	.plat_auto	= sizeof(struct efi_media_plat),
> +};
> diff --git a/include/efi.h b/include/efi.h
> index b5835422b95..0ec5913ddd1 100644
> --- a/include/efi.h
> +++ b/include/efi.h
> @@ -414,6 +414,17 @@ struct efi_priv {
>   	void *next_hdr;
>   };
>
> +/*
> + * EFI attributes of the udevice handled by efi_media driver
> + *
> + * @handle: handle of the controller on which this driver is installed
> + * @blkio: block io protocol proxied by this driver
> + */
> +struct efi_media_plat {
> +	efi_handle_t		handle;
> +	struct efi_block_io	*blkio;
> +};
> +
>   /* Base address of the EFI image */
>   extern char image_base[];
>
>

  reply	other threads:[~2021-09-08 17:59 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-08 13:33 [PATCH 00/35] efi: Improvements to U-Boot running on top of UEFI Simon Glass
2021-09-08 13:33 ` [PATCH 01/35] x86: Keep symbol information in u-boot ELF file Simon Glass
2021-09-08 13:33 ` [PATCH 02/35] x86: Create a new header for EFI Simon Glass
2021-09-08 17:22   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-09  9:25       ` Heinrich Schuchardt
2021-09-09 19:57         ` Simon Glass
2021-09-08 13:33 ` [PATCH 03/35] x86: Show some EFI info with the bdinfo command Simon Glass
2021-09-08 17:29   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-09  9:29       ` Heinrich Schuchardt
2021-09-09 20:08         ` Simon Glass
2021-09-08 13:33 ` [PATCH 04/35] x86: Tidy up global_data pointer for 64-bit Simon Glass
2021-09-08 17:30   ` Heinrich Schuchardt
2021-09-08 13:33 ` [PATCH 05/35] efi: Add a script for building and testing U-Boot on UEFI Simon Glass
2021-09-08 13:33 ` [PATCH 06/35] x86: Create a 32/64-bit selection for the app Simon Glass
2021-09-08 17:35   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-08 13:33 ` [PATCH 07/35] efi: Create a 64-bit app Simon Glass
2021-09-08 17:37   ` Heinrich Schuchardt
2021-09-08 13:33 ` [PATCH 08/35] x86: Don't duplicate global_ptr in 64-bit EFI app Simon Glass
2021-09-08 13:33 ` [PATCH 09/35] efi: Add a way to obtain boot services in the app Simon Glass
2021-09-08 13:33 ` [PATCH 10/35] efi: Add video support to " Simon Glass
2021-09-08 17:40   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-08 13:33 ` [PATCH 11/35] RFC: efi: Drop code that doesn't work with driver model Simon Glass
2021-09-08 17:44   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-09  9:21       ` Heinrich Schuchardt
2021-09-09 19:57         ` Simon Glass
2021-09-09 20:14           ` Tom Rini
2021-09-09 20:15           ` Mark Kettenis
2021-09-09 20:23             ` Tom Rini
2021-09-09 21:45               ` Mark Kettenis
2021-09-09 22:06                 ` Tom Rini
2021-09-24  2:48                 ` Simon Glass
2021-09-24 10:36                   ` Mark Kettenis
2021-09-24 12:32         ` Simon Glass
2021-09-08 13:33 ` [PATCH 12/35] efi: Add EFI uclass for media Simon Glass
2021-09-08 17:50   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-08 13:33 ` [PATCH 13/35] efi: Add a media/block driver for EFI block devices Simon Glass
2021-09-08 17:59   ` Heinrich Schuchardt [this message]
2021-09-09  8:57     ` Simon Glass
2021-09-09 10:35       ` Heinrich Schuchardt
2021-09-09 19:58         ` Simon Glass
2021-09-08 13:33 ` [PATCH 14/35] efi: Locate all block devices in the app Simon Glass
2021-09-08 18:14   ` Heinrich Schuchardt
2021-09-09  1:11     ` AKASHI Takahiro
2021-09-09 20:09       ` Simon Glass
2021-09-10  0:50         ` AKASHI Takahiro
2021-09-09 20:09     ` Simon Glass
2021-09-08 13:33 ` [PATCH 15/35] patman: Use a ValueError exception if tools.Run() fails Simon Glass
2021-09-08 13:33 ` [PATCH 16/35] binman: Report an error if test files fail to compile Simon Glass
2021-09-08 13:33 ` [PATCH 17/35] binman: Support reading the offset of an ELF-file symbol Simon Glass
2021-09-08 13:33 ` [PATCH 18/35] binman: Allow timeout to occur in the image or its section Simon Glass
2021-09-08 13:33 ` [PATCH 19/35] binman: Tidy up comments on _DoTestFile() Simon Glass
2021-09-08 13:33 ` [PATCH 20/35] binman: Support updating the dtb in an ELF file Simon Glass
2021-09-08 13:33 ` [PATCH 21/35] efi: serial: Support arrow keys Simon Glass
2021-09-08 13:33 ` [PATCH 22/35] bloblist: Move to rST format Simon Glass
2021-09-08 18:18   ` Heinrich Schuchardt
2021-09-08 13:33 ` [PATCH 23/35] bloblist: Support allocating the bloblist Simon Glass
2021-09-08 13:33 ` [PATCH 24/35] x86: Allow booting a kernel from the EFI app Simon Glass
2021-09-08 18:22   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-08 13:33 ` [PATCH 25/35] x86: Don't process the kernel command line unless enabled Simon Glass
2021-09-08 13:33 ` [PATCH 26/35] x86: efi: Add room for the binman definition in the dtb Simon Glass
2021-09-08 13:33 ` [PATCH 27/35] efi: Add comments to struct efi_priv Simon Glass
2021-09-08 13:33 ` [PATCH 28/35] efi: Fix ll_boot_init() operation with the app Simon Glass
2021-09-08 13:33 ` [PATCH 29/35] efi: Add a few comments to the stub Simon Glass
2021-09-08 13:34 ` [PATCH 30/35] efi: Share struct efi_priv between the app and stub code Simon Glass
2021-09-08 13:34 ` [PATCH 31/35] efi: Move exit_boot_services into a function Simon Glass
2021-09-08 13:34 ` [PATCH 32/35] efi: Check for failure when initing the app Simon Glass
2021-09-08 13:34 ` [PATCH 33/35] efi: Mention that efi_info_get() is only used in the stub Simon Glass
2021-09-08 13:34 ` [PATCH 34/35] efi: Show when allocated pages are used Simon Glass
2021-09-08 18:25   ` Heinrich Schuchardt
2021-09-09  8:57     ` Simon Glass
2021-09-09 10:39       ` Heinrich Schuchardt
2021-09-09 19:58         ` Simon Glass
2021-09-08 13:34 ` [PATCH 35/35] efi: Allow easy selection of serial-only operation Simon Glass
2021-09-09 16:29 ` [PATCH 00/35] efi: Improvements to U-Boot running on top of UEFI Bin Meng
2021-09-09 16:34   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=21126ea8-9842-49fd-c01d-6408b5a28218@gmx.de \
    --to=xypron.glpk@gmx.de \
    --cc=agraf@csgraf.de \
    --cc=bmeng.cn@gmail.com \
    --cc=christian.melki@t2data.com \
    --cc=ilias.apalodimas@linaro.org \
    --cc=sjg@chromium.org \
    --cc=trini@konsulko.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.