[U-Boot] [PATCH v2 03/40] dm: blk: Add a generic function for block device commands
Bin Meng
bmeng.cn at gmail.com
Tue Aug 1 04:56:35 UTC 2017
Hi Simon,
On Sun, Jul 30, 2017 at 1:34 AM, Simon Glass <sjg at chromium.org> wrote:
> Most block devices provide a command (e.g. 'sata', 'scsi', 'ide') and
> these commands generally do the same thing. This makes it harder to
> maintain this code and keep it consistent.
>
> We now have a block device interface which is either implemented by driver
> model (when CONFIG_BLK is enabled) or with a legacy interface. Therefore
> it is possible to handle most of what these commands do with generic code.
>
> Add a new generic function to process block-device commands using the
> interface type and the current device number for that type.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
> Changes in v2: None
>
> cmd/Makefile | 1 +
> cmd/blk_common.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
> include/blk.h | 12 +++++++
> 3 files changed, 117 insertions(+)
> create mode 100644 cmd/blk_common.c
>
> diff --git a/cmd/Makefile b/cmd/Makefile
> index bd231f24d8..e2b3a9cc71 100644
> --- a/cmd/Makefile
> +++ b/cmd/Makefile
> @@ -15,6 +15,7 @@ obj-y += version.o
> # command
> obj-$(CONFIG_CMD_AES) += aes.o
> obj-$(CONFIG_CMD_ARMFLASH) += armflash.o
> +obj-y += blk_common.o
> obj-$(CONFIG_SOURCE) += source.o
> obj-$(CONFIG_CMD_SOURCE) += source.o
> obj-$(CONFIG_CMD_BDI) += bdinfo.o
> diff --git a/cmd/blk_common.c b/cmd/blk_common.c
> new file mode 100644
> index 0000000000..86c75e78d8
> --- /dev/null
> +++ b/cmd/blk_common.c
> @@ -0,0 +1,104 @@
> +/*
> + * Handling of common block commands
> + *
> + * Copyright (c) 2017 Google, Inc
> + *
> + * (C) Copyright 2000-2011
> + * Wolfgang Denk, DENX Software Engineering, wd at denx.de.
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <blk.h>
> +
> +#ifdef HAVE_BLOCK_DEVICE
> +int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
> + int *cur_devnump)
> +{
> + const char *if_name = blk_get_if_type_name(if_type);
> +
> + switch (argc) {
> + case 0:
> + case 1:
> + return CMD_RET_USAGE;
> + case 2:
> + if (strncmp(argv[1], "inf", 3) == 0) {
> + blk_list_devices(if_type);
> + return 0;
> + } else if (strncmp(argv[1], "dev", 3) == 0) {
> + if (blk_print_device_num(if_type, *cur_devnump)) {
> + printf("\nno %s devices available\n", if_name);
> + return CMD_RET_FAILURE;
> + }
> + return 0;
> + } else if (strncmp(argv[1], "part", 4) == 0) {
> + if (blk_list_part(if_type))
> + printf("\nno %s devices available\n", if_name);
> + return 0;
> + }
> + return CMD_RET_USAGE;
> + case 3:
> + if (strncmp(argv[1], "dev", 3) == 0) {
> + int dev = (int)simple_strtoul(argv[2], NULL, 10);
> +
> + if (!blk_show_device(if_type, dev)) {
> + *cur_devnump = dev;
> + printf("... is now current device\n");
> + } else {
> + return CMD_RET_FAILURE;
> + }
> + return 0;
> + } else if (strncmp(argv[1], "part", 4) == 0) {
> + int dev = (int)simple_strtoul(argv[2], NULL, 10);
> +
> + if (blk_print_part_devnum(if_type, dev)) {
> + printf("\n%s device %d not available\n",
> + if_name, dev);
> + return CMD_RET_FAILURE;
> + }
> + return 0;
> + }
> + return CMD_RET_USAGE;
> +
> + default: /* at least 4 args */
> + if (strcmp(argv[1], "read") == 0) {
> + ulong addr = simple_strtoul(argv[2], NULL, 16);
> + lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
> + ulong cnt = simple_strtoul(argv[4], NULL, 16);
> + ulong n;
> +
> + printf("\n%s read: device %d block # %lld, count %ld ... ",
> + if_name, *cur_devnump, (unsigned long long)blk,
> + cnt);
Please use LBAFU for parameter blk, to handle both 32-bit and 64-bit LBA.
> +
> + n = blk_read_devnum(if_type, *cur_devnump, blk, cnt,
> + (ulong *)addr);
> +
> + printf("%ld blocks read: %s\n", n,
> + n == cnt ? "OK" : "ERROR");
> + return n == cnt ? 0 : 1;
> + } else if (strcmp(argv[1], "write") == 0) {
> + ulong addr = simple_strtoul(argv[2], NULL, 16);
> + lbaint_t blk = simple_strtoul(argv[3], NULL, 16);
> + ulong cnt = simple_strtoul(argv[4], NULL, 16);
> + ulong n;
> +
> + printf("\n%s write: device %d block # %lld, count %ld ... ",
> + if_name, *cur_devnump, (unsigned long long)blk,
> + cnt);
ditto.
> +
> + n = blk_write_devnum(if_type, *cur_devnump, blk, cnt,
> + (ulong *)addr);
> +
> + printf("%ld blocks written: %s\n", n,
> + n == cnt ? "OK" : "ERROR");
> + return n == cnt ? 0 : 1;
> + } else {
> + return CMD_RET_USAGE;
> + }
> +
> + return 0;
> + }
> +}
> +#endif
> diff --git a/include/blk.h b/include/blk.h
> index 69076d3683..5e29c6a21f 100644
> --- a/include/blk.h
> +++ b/include/blk.h
> @@ -631,4 +631,16 @@ int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart);
> */
> const char *blk_get_if_type_name(enum if_type if_type);
>
> +/**
> + * blk_common_cmd() - handle common commands with block devices
> + *
> + * @args: Number of arguments to the command (argv[0] is the command itself)
> + * @argv: Command arguments
> + * @if_type: Interface type
> + * @cur_devnump: Current device number for this interface type
> + * @return 0 if OK, CMD_RET_ERROR on error
> + */
> +int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
> + int *cur_devnump);
> +
> #endif
> --
Regards,
Bin
More information about the U-Boot
mailing list