From: AKASHI Takahiro <takahiro.akashi@linaro.org>
To: Simon Glass <sjg@chromium.org>
Cc: U-Boot Mailing List <u-boot@lists.denx.de>,
Tom Rini <trini@konsulko.com>,
Heinrich Schuchardt <xypron.glpk@gmx.de>,
Marek Vasut <marex@denx.de>,
Masahisa Kojima <masahisa.kojima@linaro.org>,
Pavel Herrmann <morpheus.ibis@gmail.com>
Subject: Re: [PATCH 14/45] dm: blk: Add udevice functions
Date: Mon, 26 Sep 2022 09:17:28 +0900 [thread overview]
Message-ID: <20220926001728.GB7925@laputa> (raw)
In-Reply-To: <20220925150248.2524421-15-sjg@chromium.org>
Hi Simon,
On Sun, Sep 25, 2022 at 09:02:17AM -0600, Simon Glass wrote:
> At present we have functions called blk_dread(), etc., which take a
> struct blk_desc * to refer to the block device. Add some functions which
> use udevice instead, since this is more in keeping with how driver model
> is supposed to work.
Unfortunately, NAK.
I have already added similar functions in disk/disk-uclass.c
with my commit 59da9d4782cd ("dm: disk: add read/write interfaces with
udevice"). dev_read()/dev_write() works well with UCLASS_BLK (as intended).
I remember that you also ack'ed that patch.
-Takahiro Akashi
> Update one of the tests to use this.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
> drivers/block/blk-uclass.c | 51 +++++++++++++++++++++++++-------------
> include/blk.h | 39 ++++++++++++++++++++++++++++-
> test/dm/usb.c | 11 +++++---
> 3 files changed, 80 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
> index f8157c8d6ae..7070fd15c89 100644
> --- a/drivers/block/blk-uclass.c
> +++ b/drivers/block/blk-uclass.c
> @@ -444,53 +444,70 @@ int blk_get_device(int uclass_id, int devnum, struct udevice **devp)
> return device_probe(*devp);
> }
>
> -unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
> - lbaint_t blkcnt, void *buffer)
> +long blk_read(struct udevice *dev, lbaint_t start, lbaint_t blkcnt, void *buf)
> {
> - struct udevice *dev = block_dev->bdev;
> + struct blk_desc *desc = dev_get_uclass_plat(dev);
> const struct blk_ops *ops = blk_get_ops(dev);
> ulong blks_read;
>
> if (!ops->read)
> return -ENOSYS;
>
> - if (blkcache_read(block_dev->uclass_id, block_dev->devnum,
> - start, blkcnt, block_dev->blksz, buffer))
> + if (blkcache_read(desc->uclass_id, desc->devnum,
> + start, blkcnt, desc->blksz, buf))
> return blkcnt;
> - blks_read = ops->read(dev, start, blkcnt, buffer);
> + blks_read = ops->read(dev, start, blkcnt, buf);
> if (blks_read == blkcnt)
> - blkcache_fill(block_dev->uclass_id, block_dev->devnum,
> - start, blkcnt, block_dev->blksz, buffer);
> + blkcache_fill(desc->uclass_id, desc->devnum, start, blkcnt,
> + desc->blksz, buf);
>
> return blks_read;
> }
>
> -unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
> - lbaint_t blkcnt, const void *buffer)
> +long blk_write(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
> + const void *buf)
> {
> - struct udevice *dev = block_dev->bdev;
> + struct blk_desc *desc = dev_get_uclass_plat(dev);
> const struct blk_ops *ops = blk_get_ops(dev);
>
> if (!ops->write)
> return -ENOSYS;
>
> - blkcache_invalidate(block_dev->uclass_id, block_dev->devnum);
> - return ops->write(dev, start, blkcnt, buffer);
> + blkcache_invalidate(desc->uclass_id, desc->devnum);
> +
> + return ops->write(dev, start, blkcnt, buf);
> }
>
> -unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
> - lbaint_t blkcnt)
> +long blk_erase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt)
> {
> - struct udevice *dev = block_dev->bdev;
> + struct blk_desc *desc = dev_get_uclass_plat(dev);
> const struct blk_ops *ops = blk_get_ops(dev);
>
> if (!ops->erase)
> return -ENOSYS;
>
> - blkcache_invalidate(block_dev->uclass_id, block_dev->devnum);
> + blkcache_invalidate(desc->uclass_id, desc->devnum);
> +
> return ops->erase(dev, start, blkcnt);
> }
>
> +ulong blk_dread(struct blk_desc *desc, lbaint_t start, lbaint_t blkcnt,
> + void *buffer)
> +{
> + return blk_read(desc->bdev, start, blkcnt, buffer);
> +}
> +
> +ulong blk_dwrite(struct blk_desc *desc, lbaint_t start, lbaint_t blkcnt,
> + const void *buffer)
> +{
> + return blk_write(desc->bdev, start, blkcnt, buffer);
> +}
> +
> +ulong blk_derase(struct blk_desc *desc, lbaint_t start, lbaint_t blkcnt)
> +{
> + return blk_erase(desc->bdev, start, blkcnt);
> +}
> +
> int blk_get_from_parent(struct udevice *parent, struct udevice **devp)
> {
> struct udevice *dev;
> diff --git a/include/blk.h b/include/blk.h
> index cdc6f0fc7eb..8614d1420ac 100644
> --- a/include/blk.h
> +++ b/include/blk.h
> @@ -273,6 +273,43 @@ unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
> unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
> lbaint_t blkcnt);
>
> +/**
> + * blk_read() - Read from a block device
> + *
> + * @dev: Device to read from
> + * @start: Start block for the read
> + * @blkcnt: Number of blocks to read
> + * @buf: Place to put the data
> + * @return number of blocks read (which may be less than @blkcnt),
> + * or -ve on error. This never returns 0 unless @blkcnt is 0
> + */
> +long blk_read(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
> + void *buffer);
> +
> +/**
> + * blk_write() - Write to a block device
> + *
> + * @dev: Device to write to
> + * @start: Start block for the write
> + * @blkcnt: Number of blocks to write
> + * @buf: Data to write
> + * @return number of blocks written (which may be less than @blkcnt),
> + * or -ve on error. This never returns 0 unless @blkcnt is 0
> + */
> +long blk_write(struct udevice *dev, lbaint_t start, lbaint_t blkcnt,
> + const void *buffer);
> +
> +/**
> + * blk_erase() - Erase part of a block device
> + *
> + * @dev: Device to erase
> + * @start: Start block for the erase
> + * @blkcnt: Number of blocks to erase
> + * @return number of blocks erased (which may be less than @blkcnt),
> + * or -ve on error. This never returns 0 unless @blkcnt is 0
> + */
> +long blk_erase(struct udevice *dev, lbaint_t start, lbaint_t blkcnt);
> +
> /**
> * blk_find_device() - Find a block device
> *
> @@ -428,7 +465,7 @@ const char *blk_get_devtype(struct udevice *dev);
>
> /**
> * blk_get_by_device() - Get the block device descriptor for the given device
> - * @dev: Instance of a storage device
> + * @dev: Instance of a storage device (the parent of the block device)
> *
> * Return: With block device descriptor on success , NULL if there is no such
> * block device.
> diff --git a/test/dm/usb.c b/test/dm/usb.c
> index 5d6ceefce0b..445b21a560b 100644
> --- a/test/dm/usb.c
> +++ b/test/dm/usb.c
> @@ -43,19 +43,24 @@ DM_TEST(dm_test_usb_base, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
> */
> static int dm_test_usb_flash(struct unit_test_state *uts)
> {
> - struct udevice *dev;
> - struct blk_desc *dev_desc;
> + struct blk_desc *dev_desc, *chk;
> + struct udevice *dev, *blk;
> char cmp[1024];
>
> state_set_skip_delays(true);
> ut_assertok(usb_init());
> ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
> ut_assertok(blk_get_device_by_str("usb", "0", &dev_desc));
> + chk = blk_get_by_device(dev);
> + ut_asserteq_ptr(chk, dev_desc);
> +
> + ut_assertok(device_find_first_child_by_uclass(dev, UCLASS_BLK, &blk));
> + ut_asserteq_ptr(chk, blk_get_by_device(dev));
>
> /* Read a few blocks and look for the string we expect */
> ut_asserteq(512, dev_desc->blksz);
> memset(cmp, '\0', sizeof(cmp));
> - ut_asserteq(2, blk_dread(dev_desc, 0, 2, cmp));
> + ut_asserteq(2, blk_read(blk, 0, 2, cmp));
> ut_assertok(strcmp(cmp, "this is a test"));
> ut_assertok(usb_stop());
>
> --
> 2.37.3.998.g577e59143f-goog
>
next prev parent reply other threads:[~2022-09-26 0:17 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-25 15:02 [PATCH 00/45] vbe: Implement the full firmware flow Simon Glass
2022-09-25 15:02 ` [PATCH 01/45] Rename CONFIG_SYS_TEXT_BASE to CONFIG_TEXT_BASE Simon Glass
2022-09-25 15:02 ` [PATCH 02/45] disk: Drop debug messages in part_efi Simon Glass
2022-09-26 6:11 ` Heinrich Schuchardt
2022-09-25 15:02 ` [PATCH 03/45] bloblist: Drop debugging Simon Glass
2022-09-25 15:02 ` [PATCH 04/45] rsa: Avoid warning in padding_pss_verify() Simon Glass
2022-09-26 6:23 ` Heinrich Schuchardt
2022-09-25 15:02 ` [PATCH 05/45] spl: Use binman suffix allow symbols of any SPL etype Simon Glass
2022-09-25 15:02 ` [PATCH 06/45] spl: Split up the board_init_r() function Simon Glass
2022-09-25 15:02 ` [PATCH 07/45] spl: Refactor controls for console output Simon Glass
2022-09-29 15:16 ` Tom Rini
2022-09-25 15:02 ` [PATCH 08/45] spl: Add a separate silence option for SPL Simon Glass
2022-09-25 15:02 ` [PATCH 09/45] CI: Install pyelftools for builds Simon Glass
2022-09-26 6:29 ` Heinrich Schuchardt
2022-09-28 10:20 ` Simon Glass
2022-09-29 15:05 ` Tom Rini
2022-09-29 23:55 ` Simon Glass
2022-09-30 12:56 ` Tom Rini
2022-09-30 13:28 ` Simon Glass
2022-09-25 15:02 ` [PATCH 10/45] binman: Allow obtaining a symbol value Simon Glass
2022-09-25 15:02 ` [PATCH 11/45] binman: Split out looking up a symbol into a function Simon Glass
2022-09-25 15:02 ` [PATCH 12/45] binman: Handle writing ELF symbols in the Entry class Simon Glass
2022-09-25 15:02 ` [PATCH 13/45] binman: Support writing symbols into ELF files Simon Glass
2022-09-25 15:02 ` [PATCH 14/45] dm: blk: Add udevice functions Simon Glass
2022-09-26 0:17 ` AKASHI Takahiro [this message]
2022-09-28 10:20 ` Simon Glass
2022-09-29 0:51 ` AKASHI Takahiro
2022-09-29 2:35 ` Simon Glass
2022-09-30 1:54 ` AKASHI Takahiro
2022-09-25 15:02 ` [PATCH 15/45] dm: usb: Update the test to cover reading and writing Simon Glass
2022-09-25 15:02 ` [PATCH 16/45] dm: blk: mmc: Tidy up some Makefile rules for SPL Simon Glass
2022-09-25 15:02 ` [PATCH 17/45] dm: mmc: Allow sandbox emulator to build without writes Simon Glass
2022-09-25 15:02 ` [PATCH 18/45] sandbox: Drop message about writing sandbox state Simon Glass
2022-09-26 6:31 ` Heinrich Schuchardt
2022-09-25 15:02 ` [PATCH 19/45] sandbox: Generalise SPL booting Simon Glass
2022-09-25 15:02 ` [PATCH 20/45] sandbox: Add a way to specify the sandbox executable Simon Glass
2022-09-26 6:49 ` Heinrich Schuchardt
2022-11-07 23:35 ` Simon Glass
2022-09-25 15:02 ` [PATCH 21/45] bootstd: Add a way to set up a bootflow Simon Glass
2022-09-25 15:02 ` [PATCH 22/45] image: Move comment for fit_conf_find_compat() Simon Glass
2022-09-26 6:54 ` Heinrich Schuchardt
2022-09-25 15:02 ` [PATCH 23/45] test: Report skippped tests Simon Glass
2022-09-25 15:02 ` [PATCH 24/45] test: Update tests to use the skip feature Simon Glass
2022-09-25 15:02 ` [PATCH 25/45] test: Support tests which can only be run manually Simon Glass
2022-09-26 6:56 ` Heinrich Schuchardt
2022-09-28 10:20 ` Simon Glass
2022-09-25 15:02 ` [PATCH 26/45] image: Add the concept of a phase to FIT Simon Glass
2022-09-25 15:02 ` [PATCH 27/45] image: Allow loading a FIT config for a particular phase Simon Glass
2022-09-25 15:02 ` [PATCH 28/45] image: Correct strncpy() warning with image_set_name() Simon Glass
2022-09-25 15:02 ` [PATCH 29/45] vbe: Rename vbe_fixup to vbe_request Simon Glass
2022-09-25 15:02 ` [PATCH 30/45] vbe: Use a warning for a failed requests Simon Glass
2022-09-25 15:02 ` [PATCH 31/45] spl: Allow multiple loaders of the same type Simon Glass
2022-09-30 16:28 ` Tom Rini
2022-09-30 16:37 ` Simon Glass
2022-09-30 16:39 ` Tom Rini
2022-09-30 16:45 ` Simon Glass
2022-09-30 16:50 ` Tom Rini
2022-09-30 16:55 ` Simon Glass
2022-09-25 15:02 ` [PATCH 32/45] sandbox: Support obtaining the next phase from an image Simon Glass
2022-09-25 15:02 ` [PATCH 33/45] vbe: Support selecting operations by SPL phase Simon Glass
2022-09-25 15:02 ` [PATCH 34/45] vbe: Support reading the next SPL phase via VBE Simon Glass
2022-09-25 15:02 ` [PATCH 35/45] vbe: Move OS implementation into a separate file Simon Glass
2022-09-25 15:02 ` [PATCH 36/45] vbe: Drop the U-Boot prefix from the version Simon Glass
2022-09-25 15:02 ` [PATCH 37/45] vbe: Add Kconfig options for VPL Simon Glass
2022-09-25 15:02 ` [PATCH 38/45] vbe: Add info about the VBE device to the fwupd node Simon Glass
2022-09-25 15:02 ` [PATCH 39/45] sandbox: Add a binman image for VPL Simon Glass
2022-09-25 15:02 ` [PATCH 40/45] vbe: Correct pylint warnings in test_vbe Simon Glass
2022-09-25 15:02 ` [PATCH 41/45] vbe: Use a manual test Simon Glass
2022-09-25 15:02 ` [PATCH 42/45] vbe: Record which phases loaded using VBE Simon Glass
2022-09-25 15:02 ` [PATCH 43/45] vbe: Add docs and a test for the VBE command Simon Glass
2022-09-25 15:02 ` [PATCH 44/45] vbe: Add a subcommand to show the VBE state Simon Glass
2022-09-25 15:02 ` [PATCH 45/45] vbe: Add a test for the VBE flow into U-Boot proper Simon Glass
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=20220926001728.GB7925@laputa \
--to=takahiro.akashi@linaro.org \
--cc=marex@denx.de \
--cc=masahisa.kojima@linaro.org \
--cc=morpheus.ibis@gmail.com \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=xypron.glpk@gmx.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).