From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.2 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 71169C433EF for ; Wed, 8 Sep 2021 17:59:21 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 66175610E9 for ; Wed, 8 Sep 2021 17:59:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 66175610E9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.denx.de Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 8B37583420; Wed, 8 Sep 2021 19:59:17 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=fail (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; secure) header.d=gmx.net header.i=@gmx.net header.b="GDcxtqMD"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 806B58342B; Wed, 8 Sep 2021 19:59:15 +0200 (CEST) Received: from mout.gmx.net (mout.gmx.net [212.227.15.15]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id EB7B183420 for ; Wed, 8 Sep 2021 19:59:11 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=gmx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=xypron.glpk@gmx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1631123949; bh=R/bVpe7Qf3qeFrKiIrsdfysx7q/pMKUqqSP6lOp8j2c=; h=X-UI-Sender-Class:Subject:To:Cc:References:From:Date:In-Reply-To; b=GDcxtqMD3L2skjbCyWRMLp/8/KZATqAbryqalTRqnfaDRHJuY1tqsp0iFVWSpeDVs T4ZW6unmGHQY6tsSp38rO8oGxsnwG0rMFNtG8zkYfNKhCp27ctQ6JfyYRMAE6H3icr Kg+6wan7bnk5sIjYjTcUOHWG3D9ts2EmynHY23vI= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from [192.168.123.55] ([88.152.144.157]) by mail.gmx.net (mrgmx004 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MvsIv-1nGY4x3Otj-00sxFe; Wed, 08 Sep 2021 19:59:08 +0200 Subject: Re: [PATCH 13/35] efi: Add a media/block driver for EFI block devices To: Simon Glass Cc: Ilias Apalodimas , Bin Meng , Tom Rini , Christian Melki , Alexander Graf , U-Boot Mailing List References: <20210908133405.696481-1-sjg@chromium.org> <20210908073355.13.I9b48fe5f6b8c61348f16a1b5df114282240238c0@changeid> From: Heinrich Schuchardt Message-ID: <21126ea8-9842-49fd-c01d-6408b5a28218@gmx.de> Date: Wed, 8 Sep 2021 19:59:08 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: <20210908073355.13.I9b48fe5f6b8c61348f16a1b5df114282240238c0@changeid> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:tfbk40tlSjcpVdLjeaRWIluNzZXvO3LkMXORiIG+DR51kr6e1++ x+fDLrbeg2qDb6uheXWjCsbLD0rjbik4F3A6ikbrp8ZGCQs3bLhUIybVVfF4MRpFMIVQx1k pjxrEnro54IwZzekuQrLl8UJrhiRHWOTWCEcXjcZRXsw8zgxjmCJNsq0XUKoeg7gzpcGkQc BFQ6HJwTyPsjZ+t9Oi1bQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:DDs/eQhGy4A=:Ra9xwWNVkKH+fco/08br9G Q7soK0WMmh248IRq4B9q5h8fcD8GRbyEPNmxfbPqZC0UtRrLnVt9dDWgSMXpLua5i4+tpyzB6 QSpULwulEb2czsjAj2tILiUqbxhrEz90x/FJrTl6sDWsCI7NYHu8JvVx71/btdWaILvnN7OYN zksC1463fLcmPqt7Ty3xCyrCCbZqWh8tMV2xxjZ5RAv+e6zQhAsGf/7APq8WcgEAaA4rd4gjm tpbw5Uim1apPSqqsEVicA8sgxtEL033jc0S9BdE3GWjue/salo8YtLD0rndPA30rggoF5zjW2 SmyRKYEPBXoaWd7as5KxqQ/DUqrXeTb3Dy3MTybjaFLQy7oO6PuDLkOdfa0i2btfDAw038ARH OjC46troJY0yIBdK19qTJRv2iEYJUY/Hq01loX9oV0N1SyG51idXQH1BPCkgrXXdq5eZCFsQ0 z5/NCDetszvjOT0eSpQr8y6Atk09G8pUaSjC72+XgNdYPrbVVxrICbWHMHVQXzvDEEeqzorLb JtuqEbUxd25U0N3elnHqpPhpsELD+lZDhM54Dg5nIV7kmPCXRd1fnn9jyIqIMPMMs9JEyw4Hz OLIMhRl5P7++tkSy3SGFXZSmkfyQfwJAa6zGLHeYwyfPMTY7GNTl1HCoH/f52tFIcYO7ZJ74H /m9jHLkLB41dd2n0U1H9gEIixNWOVGTsULiEgGooyIPM85Ni4ZZF5qS8EB/DiTwwEsQJoPXmW D1IBZ10+JXrrdvpkP26iU3qYQJ+ShR1g1/wdV09vUylldPPs5dPNxfzhusRTLnOzD51zaxwqF IBEt61KNjVIEBqiMX9mBHwvpzDbbAOhZ1wQ/iZLVYsCnu7ltVNzWPJG94YYayGoCiP3L5ZmBT 4UqsVICfQgkQbaqcQBjnl2u4SBLzl6TtQUEfeQORf539v9q/Ts79yHa7HUqc1xsd2BDD6R6d9 CmsgBrChX6W2iELXgvswbuNTI4Oa6ehq5fiRPkf4Adg8Hd2WHj54lbVzn8MZKMvG19rBa6SMH Bhqymo6fHEz77uE0GY7Jai2sIZcd42CPencZOyVDS9b4Y9zbOkpFPy90pTx7cElT+d/ArSsJ2 h4krR+jYi9x5w8= X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.34 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.2 at phobos.denx.de X-Virus-Status: Clean 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 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 doe= s > 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) +=3D blkcache.o > > obj-$(CONFIG_EFI_MEDIA) +=3D efi-media-uclass.o > obj-$(CONFIG_EFI_MEDIA_SANDBOX) +=3D sb_efi_media.o > +obj-$(CONFIG_EFI_MEDIA_BLK) +=3D 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 b= oot > + * services > + * > + * Copyright 2021 Google LLC > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +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 =3D dev_get_plat(dev); > + struct efi_block_io *io =3D plat->blkio; > + efi_status_t ret; > + > + log_debug("read buf=3D%p, block=3D%lx, count=3D%lx: ", buffer, (ulong)= blknr, > + (ulong)blkcnt); > + ret =3D io->read_blocks(io, io->media->media_id, blknr, > + blkcnt * io->media->block_size, buffer); > + log_debug("ret=3D%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 =3D dev_get_plat(dev); > + struct efi_block_io *io =3D plat->blkio; > + efi_status_t ret; > + > + log_debug("write buf=3D%p, block=3D%lx, count=3D%lx: ", buffer, (ulong= )blknr, > + (ulong)blkcnt); > + ret =3D io->write_blocks(io, io->media->media_id, blknr, > + blkcnt * io->media->block_size, (void *)buffer); > + log_debug("ret=3D%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 =3D { > + .read =3D efi_bl_read, > + .write =3D efi_bl_write, > +}; > + > +U_BOOT_DRIVER(efi_block) =3D { > + .name =3D "efi_block", > + .id =3D UCLASS_BLK, > + .ops =3D &efi_blk_ops, > + .plat_auto =3D sizeof(struct efi_block_plat), > +}; > + > +static int efi_media_bind(struct udevice *dev) > +{ > + struct efi_media_plat *plat =3D dev_get_plat(dev); > + struct efi_block_plat *blk_plat; > + struct udevice *blk; > + int ret; > + > + ret =3D 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 =3D dev_get_plat(blk); > + blk_plat->blkio =3D plat->blkio; > + > + return 0; > +} > + > +U_BOOT_DRIVER(efi_media) =3D { > + .name =3D "efi_media", > + .id =3D UCLASS_EFI_MEDIA, > + .bind =3D efi_media_bind, > + .plat_auto =3D 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[]; > >