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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id CC433C001DE for ; Thu, 27 Jul 2023 00:34:02 +0000 (UTC) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 0775C86373; Thu, 27 Jul 2023 02:34:00 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="WmqY+2oE"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 0CF3286785; Thu, 27 Jul 2023 02:33:58 +0200 (CEST) Received: from mail-pg1-x52e.google.com (mail-pg1-x52e.google.com [IPv6:2607:f8b0:4864:20::52e]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 8DC75862A9 for ; Thu, 27 Jul 2023 02:33:50 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=takahiro.akashi@linaro.org Received: by mail-pg1-x52e.google.com with SMTP id 41be03b00d2f7-55b5a37acb6so63505a12.0 for ; Wed, 26 Jul 2023 17:33:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1690418029; x=1691022829; h=in-reply-to:content-disposition:mime-version:references :mail-followup-to:message-id:subject:cc:to:from:date:from:to:cc :subject:date:message-id:reply-to; bh=Qf/eDHmBiI6F/3p/vOYcOwfwygvMLzeTToGbM5jTesE=; b=WmqY+2oEq67JjOTslvrvB1AsahFnD7fyuW2dMIBOzrJ3rsTYhHUgSOOwqb9NsuveBm zfWpLhHMpssZHjSn7uKGNCTxdeXytJyBJ4giCiF9klw32/XpnEBhbDWY5fNgVMEX5DOJ fO51ObUS7Pqo3bh21wP/MION++hC32FbhZ5bv8KsqkZnbzBJ051L/tKvpcsSAYLaVlH5 R28AxRyJU6Mz7HTcDIZgeaF8yj8jvccOA2HMfgOZu6LUUDARrKuSY5p7eCHmesFHFKBD MzQCKzZGTOmJCYE1D1lbWCAdWzdG8yC0oGlLB4H+WZ9U8z7DBuZ2uC4WPAb/yB8m3vEa xY7w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1690418029; x=1691022829; h=in-reply-to:content-disposition:mime-version:references :mail-followup-to:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Qf/eDHmBiI6F/3p/vOYcOwfwygvMLzeTToGbM5jTesE=; b=E/tK1wlFn4E0EKqtoFKpKuOJ0YjlPdPKw/NeHcL8icU6DIcm+tmXwbCZmUpCiKJ6Ag T45/XDRCnebs01v6STTGmjLAfl+OVcXmfyRmubM2RUkdgkIk/ymHArLbgJB3VU9t4FR/ INA+tm8J2aoUJlMCQ54mrgsq0MCQasagwtYz/kdTcpl8anoubq25TGupy0sXGtjKrSup 57nJTL5ZVH4aytI5JWQnfzPA5oMkWjaJUstC9D9QOiXRnXqGirnzkvMeJt9Jcl6du4dD XKzeiNiSM1YFZLQVdpgtDhYZe0pbibA8EbYniKeQGcXEiPE06ht2peKBokzvXa94HOHN 2/Qw== X-Gm-Message-State: ABy/qLbThY1qsNsSHGay3isLpa/Y/ucVgMmPhxq0USIGs80UkNosELZ2 2IV7tXl1CBZTA0rTT0px25a+zfzHwHmrtxLAj0g= X-Google-Smtp-Source: APBJJlHUNct2iqmbSxsbmoTVq4wbmeUh2b28EmgCfXjIDFhw96llM4SDv1Z67Ac0CrE+oovzdJKnTQ== X-Received: by 2002:a17:902:d2c8:b0:1bb:ac37:384b with SMTP id n8-20020a170902d2c800b001bbac37384bmr4379169plc.6.1690418028748; Wed, 26 Jul 2023 17:33:48 -0700 (PDT) Received: from laputa ([2400:4050:c3e1:100:2103:cbda:74f4:860a]) by smtp.gmail.com with ESMTPSA id d10-20020a170902ceca00b001b9df74ba5asm141341plg.210.2023.07.26.17.33.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 26 Jul 2023 17:33:48 -0700 (PDT) Date: Thu, 27 Jul 2023 09:33:45 +0900 From: AKASHI Takahiro To: xypron.glpk@gmx.de, ilias.apalodimas@linaro.org, michal.simek@amd.com, sughosh.ganu@linaro.org Cc: u-boot@lists.denx.de Subject: Re: [RFC] efi_driver: fix a parent issue in efi-created block devices Message-ID: Mail-Followup-To: AKASHI Takahiro , xypron.glpk@gmx.de, ilias.apalodimas@linaro.org, michal.simek@amd.com, sughosh.ganu@linaro.org, u-boot@lists.denx.de References: <20230727002955.24940-1-takahiro.akashi@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20230727002955.24940-1-takahiro.akashi@linaro.org> X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 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.8 at phobos.denx.de X-Virus-Status: Clean Please ignore the following RFC since I accidentally posted the wrong patch. -Takahiro Akashi On Thu, Jul 27, 2023 at 09:29:55AM +0900, AKASHI Takahiro wrote: > An EFI application may create an EFI block device (EFI_BLOCK_IO_PROTOCOL) in > EFI world, which in turn generates a corresponding U-Boot block device based on > U-Boot's Driver Model. > The latter device, however, doesn't work as U-Boot proper block device > due to an issue in efi_driver's implementation. We saw discussions in the past, > most recently in [1]. > > [1] https://lists.denx.de/pipermail/u-boot/2023-July/522565.html > > This RFC patch tries to address (part of) the issue. > If it is considered acceptable, I will create a formal patch. > > Withtout this patch, > ===8<=== > => env set efi_selftest 'block device' > => bootefi selftest > ... > > Summary: 0 failures > > => dm tree > Class Index Probed Driver Name > ----------------------------------------------------------- > root 0 [ + ] root_driver root_driver > ... > bootmeth 7 [ ] vbe_simple | `-- vbe_simple > blk 0 [ + ] efi_blk `-- efiblk#0 > partition 0 [ + ] blk_partition `-- efiblk#0:1 > => ls efiloader 0:1 > ** Bad device specification efiloader 0 ** > Couldn't find partition efiloader 0:1 > ===>8=== > > With this patch applied, efiblk#0(:1) now gets accessible. > > ===8<=== > => env set efi_selftest 'block device' > => bootefi selftest > ... > > Summary: 0 failures > > => dm tree > Class Index Probed Driver Name > ----------------------------------------------------------- > root 0 [ + ] root_driver root_driver > ... > bootmeth 7 [ ] vbe_simple | `-- vbe_simple > efi 0 [ + ] EFI block driver `-- /VenHw(dbca4c98-6cb0-694d-0872-819c650cb7b8) > blk 0 [ + ] efi_blk `-- efiblk#0 > partition 0 [ + ] blk_partition `-- efiblk#0:1 > => ls efiloader 0:1 > 13 hello.txt > 7 u-boot.txt > > 2 file(s), 0 dir(s) > ===>8=== > > Signed-off-by: AKASHI Takahiro > --- > include/efi_driver.h | 2 +- > lib/efi_driver/efi_block_device.c | 17 ++++++++++++----- > lib/efi_driver/efi_uclass.c | 8 +++++++- > lib/efi_selftest/efi_selftest_block_device.c | 2 ++ > 4 files changed, 22 insertions(+), 7 deletions(-) > > diff --git a/include/efi_driver.h b/include/efi_driver.h > index 63a95e4cf800..ed66796f3519 100644 > --- a/include/efi_driver.h > +++ b/include/efi_driver.h > @@ -42,7 +42,7 @@ struct efi_driver_ops { > 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_handle_t handle, void *interface); > + efi_handle_t handle, void *interface, char *name); > }; > > #endif /* _EFI_DRIVER_H */ > diff --git a/lib/efi_driver/efi_block_device.c b/lib/efi_driver/efi_block_device.c > index add00eeebbea..43b7ed7c973c 100644 > --- a/lib/efi_driver/efi_block_device.c > +++ b/lib/efi_driver/efi_block_device.c > @@ -115,9 +115,9 @@ static ulong efi_bl_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, > * Return: status code > */ > static efi_status_t > -efi_bl_create_block_device(efi_handle_t handle, void *interface) > +efi_bl_create_block_device(efi_handle_t handle, void *interface, struct udevice *parent) > { > - struct udevice *bdev = NULL, *parent = dm_root(); > + struct udevice *bdev = NULL; > efi_status_t ret; > int devnum; > char *name; > @@ -181,7 +181,7 @@ err: > */ > static efi_status_t efi_bl_bind( > struct efi_driver_binding_extended_protocol *this, > - efi_handle_t handle, void *interface) > + efi_handle_t handle, void *interface, char *name) > { > efi_status_t ret = EFI_SUCCESS; > struct efi_object *obj = efi_search_obj(handle); > @@ -191,8 +191,15 @@ static efi_status_t efi_bl_bind( > if (!obj || !interface) > return EFI_INVALID_PARAMETER; > > - if (!handle->dev) > - ret = efi_bl_create_block_device(handle, interface); > + if (!handle->dev) { > + struct udevice *parent; > + > + ret = device_bind_driver(dm_root(), "EFI block driver", name, &parent); > + if (!ret) > + ret = efi_bl_create_block_device(handle, interface, parent); > + else > + ret = EFI_DEVICE_ERROR; > + } > > return ret; > } > diff --git a/lib/efi_driver/efi_uclass.c b/lib/efi_driver/efi_uclass.c > index 45f935198874..bf669742783e 100644 > --- a/lib/efi_driver/efi_uclass.c > +++ b/lib/efi_driver/efi_uclass.c > @@ -145,7 +145,13 @@ static efi_status_t EFIAPI efi_uc_start( > ret = check_node_type(controller_handle); > if (ret != EFI_SUCCESS) > goto err; > - ret = bp->ops->bind(bp, controller_handle, interface); > + > + struct efi_handler *handler; > + char tmpname[256] = "AppName"; > + ret = efi_search_protocol(controller_handle, &efi_guid_device_path, > + &handler); > + snprintf(tmpname, 256, "%pD", handler->protocol_interface); > + ret = bp->ops->bind(bp, controller_handle, interface, strdup(tmpname)); > if (ret == EFI_SUCCESS) > goto out; > > diff --git a/lib/efi_selftest/efi_selftest_block_device.c b/lib/efi_selftest/efi_selftest_block_device.c > index a367e8b89d17..0ab8e4590dfe 100644 > --- a/lib/efi_selftest/efi_selftest_block_device.c > +++ b/lib/efi_selftest/efi_selftest_block_device.c > @@ -248,6 +248,7 @@ static int teardown(void) > { > efi_status_t r = EFI_ST_SUCCESS; > > +#if 0 /* Temporarily out for confirmation */ > if (disk_handle) { > r = boottime->uninstall_protocol_interface(disk_handle, > &guid_device_path, > @@ -273,6 +274,7 @@ static int teardown(void) > return EFI_ST_FAILURE; > } > } > +#endif > return r; > } > > -- > 2.41.0 >