uboot/include/blk.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2000-2004
   4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   5 */
   6
   7#ifndef BLK_H
   8#define BLK_H
   9
  10#include <efi.h>
  11
  12#ifdef CONFIG_SYS_64BIT_LBA
  13typedef uint64_t lbaint_t;
  14#define LBAFlength "ll"
  15#else
  16typedef ulong lbaint_t;
  17#define LBAFlength "l"
  18#endif
  19#define LBAF "%" LBAFlength "x"
  20#define LBAFU "%" LBAFlength "u"
  21
  22/* Interface types: */
  23enum if_type {
  24        IF_TYPE_UNKNOWN = 0,
  25        IF_TYPE_IDE,
  26        IF_TYPE_SCSI,
  27        IF_TYPE_ATAPI,
  28        IF_TYPE_USB,
  29        IF_TYPE_DOC,
  30        IF_TYPE_MMC,
  31        IF_TYPE_SD,
  32        IF_TYPE_SATA,
  33        IF_TYPE_HOST,
  34        IF_TYPE_NVME,
  35        IF_TYPE_EFI,
  36        IF_TYPE_VIRTIO,
  37
  38        IF_TYPE_COUNT,                  /* Number of interface types */
  39};
  40
  41#define BLK_VEN_SIZE            40
  42#define BLK_PRD_SIZE            20
  43#define BLK_REV_SIZE            8
  44
  45/*
  46 * Identifies the partition table type (ie. MBR vs GPT GUID) signature
  47 */
  48enum sig_type {
  49        SIG_TYPE_NONE,
  50        SIG_TYPE_MBR,
  51        SIG_TYPE_GUID,
  52
  53        SIG_TYPE_COUNT                  /* Number of signature types */
  54};
  55
  56/*
  57 * With driver model (CONFIG_BLK) this is uclass platform data, accessible
  58 * with dev_get_uclass_platdata(dev)
  59 */
  60struct blk_desc {
  61        /*
  62         * TODO: With driver model we should be able to use the parent
  63         * device's uclass instead.
  64         */
  65        enum if_type    if_type;        /* type of the interface */
  66        int             devnum;         /* device number */
  67        unsigned char   part_type;      /* partition type */
  68        unsigned char   target;         /* target SCSI ID */
  69        unsigned char   lun;            /* target LUN */
  70        unsigned char   hwpart;         /* HW partition, e.g. for eMMC */
  71        unsigned char   type;           /* device type */
  72        unsigned char   removable;      /* removable device */
  73#ifdef CONFIG_LBA48
  74        /* device can use 48bit addr (ATA/ATAPI v7) */
  75        unsigned char   lba48;
  76#endif
  77        lbaint_t        lba;            /* number of blocks */
  78        unsigned long   blksz;          /* block size */
  79        int             log2blksz;      /* for convenience: log2(blksz) */
  80        char            vendor[BLK_VEN_SIZE + 1]; /* device vendor string */
  81        char            product[BLK_PRD_SIZE + 1]; /* device product number */
  82        char            revision[BLK_REV_SIZE + 1]; /* firmware revision */
  83        enum sig_type   sig_type;       /* Partition table signature type */
  84        union {
  85                uint32_t mbr_sig;       /* MBR integer signature */
  86                efi_guid_t guid_sig;    /* GPT GUID Signature */
  87        };
  88#if CONFIG_IS_ENABLED(BLK)
  89        /*
  90         * For now we have a few functions which take struct blk_desc as a
  91         * parameter. This field allows them to look up the associated
  92         * device. Once these functions are removed we can drop this field.
  93         */
  94        struct udevice *bdev;
  95#else
  96        unsigned long   (*block_read)(struct blk_desc *block_dev,
  97                                      lbaint_t start,
  98                                      lbaint_t blkcnt,
  99                                      void *buffer);
 100        unsigned long   (*block_write)(struct blk_desc *block_dev,
 101                                       lbaint_t start,
 102                                       lbaint_t blkcnt,
 103                                       const void *buffer);
 104        unsigned long   (*block_erase)(struct blk_desc *block_dev,
 105                                       lbaint_t start,
 106                                       lbaint_t blkcnt);
 107        void            *priv;          /* driver private struct pointer */
 108#endif
 109};
 110
 111#define BLOCK_CNT(size, blk_desc) (PAD_COUNT(size, blk_desc->blksz))
 112#define PAD_TO_BLOCKSIZE(size, blk_desc) \
 113        (PAD_SIZE(size, blk_desc->blksz))
 114
 115#if CONFIG_IS_ENABLED(BLOCK_CACHE)
 116/**
 117 * blkcache_read() - attempt to read a set of blocks from cache
 118 *
 119 * @param iftype - IF_TYPE_x for type of device
 120 * @param dev - device index of particular type
 121 * @param start - starting block number
 122 * @param blkcnt - number of blocks to read
 123 * @param blksz - size in bytes of each block
 124 * @param buf - buffer to contain cached data
 125 *
 126 * @return - '1' if block returned from cache, '0' otherwise.
 127 */
 128int blkcache_read(int iftype, int dev,
 129                  lbaint_t start, lbaint_t blkcnt,
 130                  unsigned long blksz, void *buffer);
 131
 132/**
 133 * blkcache_fill() - make data read from a block device available
 134 * to the block cache
 135 *
 136 * @param iftype - IF_TYPE_x for type of device
 137 * @param dev - device index of particular type
 138 * @param start - starting block number
 139 * @param blkcnt - number of blocks available
 140 * @param blksz - size in bytes of each block
 141 * @param buf - buffer containing data to cache
 142 *
 143 */
 144void blkcache_fill(int iftype, int dev,
 145                   lbaint_t start, lbaint_t blkcnt,
 146                   unsigned long blksz, void const *buffer);
 147
 148/**
 149 * blkcache_invalidate() - discard the cache for a set of blocks
 150 * because of a write or device (re)initialization.
 151 *
 152 * @param iftype - IF_TYPE_x for type of device
 153 * @param dev - device index of particular type
 154 */
 155void blkcache_invalidate(int iftype, int dev);
 156
 157/**
 158 * blkcache_configure() - configure block cache
 159 *
 160 * @param blocks - maximum blocks per entry
 161 * @param entries - maximum entries in cache
 162 */
 163void blkcache_configure(unsigned blocks, unsigned entries);
 164
 165/*
 166 * statistics of the block cache
 167 */
 168struct block_cache_stats {
 169        unsigned hits;
 170        unsigned misses;
 171        unsigned entries; /* current entry count */
 172        unsigned max_blocks_per_entry;
 173        unsigned max_entries;
 174};
 175
 176/**
 177 * get_blkcache_stats() - return statistics and reset
 178 *
 179 * @param stats - statistics are copied here
 180 */
 181void blkcache_stats(struct block_cache_stats *stats);
 182
 183#else
 184
 185static inline int blkcache_read(int iftype, int dev,
 186                                lbaint_t start, lbaint_t blkcnt,
 187                                unsigned long blksz, void *buffer)
 188{
 189        return 0;
 190}
 191
 192static inline void blkcache_fill(int iftype, int dev,
 193                                 lbaint_t start, lbaint_t blkcnt,
 194                                 unsigned long blksz, void const *buffer) {}
 195
 196static inline void blkcache_invalidate(int iftype, int dev) {}
 197
 198#endif
 199
 200#if CONFIG_IS_ENABLED(BLK)
 201struct udevice;
 202
 203/* Operations on block devices */
 204struct blk_ops {
 205        /**
 206         * read() - read from a block device
 207         *
 208         * @dev:        Device to read from
 209         * @start:      Start block number to read (0=first)
 210         * @blkcnt:     Number of blocks to read
 211         * @buffer:     Destination buffer for data read
 212         * @return number of blocks read, or -ve error number (see the
 213         * IS_ERR_VALUE() macro
 214         */
 215        unsigned long (*read)(struct udevice *dev, lbaint_t start,
 216                              lbaint_t blkcnt, void *buffer);
 217
 218        /**
 219         * write() - write to a block device
 220         *
 221         * @dev:        Device to write to
 222         * @start:      Start block number to write (0=first)
 223         * @blkcnt:     Number of blocks to write
 224         * @buffer:     Source buffer for data to write
 225         * @return number of blocks written, or -ve error number (see the
 226         * IS_ERR_VALUE() macro
 227         */
 228        unsigned long (*write)(struct udevice *dev, lbaint_t start,
 229                               lbaint_t blkcnt, const void *buffer);
 230
 231        /**
 232         * erase() - erase a section of a block device
 233         *
 234         * @dev:        Device to (partially) erase
 235         * @start:      Start block number to erase (0=first)
 236         * @blkcnt:     Number of blocks to erase
 237         * @return number of blocks erased, or -ve error number (see the
 238         * IS_ERR_VALUE() macro
 239         */
 240        unsigned long (*erase)(struct udevice *dev, lbaint_t start,
 241                               lbaint_t blkcnt);
 242
 243        /**
 244         * select_hwpart() - select a particular hardware partition
 245         *
 246         * Some devices (e.g. MMC) can support partitioning at the hardware
 247         * level. This is quite separate from the normal idea of
 248         * software-based partitions. MMC hardware partitions must be
 249         * explicitly selected. Once selected only the region of the device
 250         * covered by that partition is accessible.
 251         *
 252         * The MMC standard provides for two boot partitions (numbered 1 and 2),
 253         * rpmb (3), and up to 4 addition general-purpose partitions (4-7).
 254         *
 255         * @desc:       Block device to update
 256         * @hwpart:     Hardware partition number to select. 0 means the raw
 257         *              device, 1 is the first partition, 2 is the second, etc.
 258         * @return 0 if OK, -ve on error
 259         */
 260        int (*select_hwpart)(struct udevice *dev, int hwpart);
 261};
 262
 263#define blk_get_ops(dev)        ((struct blk_ops *)(dev)->driver->ops)
 264
 265/*
 266 * These functions should take struct udevice instead of struct blk_desc,
 267 * but this is convenient for migration to driver model. Add a 'd' prefix
 268 * to the function operations, so that blk_read(), etc. can be reserved for
 269 * functions with the correct arguments.
 270 */
 271unsigned long blk_dread(struct blk_desc *block_dev, lbaint_t start,
 272                        lbaint_t blkcnt, void *buffer);
 273unsigned long blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
 274                         lbaint_t blkcnt, const void *buffer);
 275unsigned long blk_derase(struct blk_desc *block_dev, lbaint_t start,
 276                         lbaint_t blkcnt);
 277
 278/**
 279 * blk_find_device() - Find a block device
 280 *
 281 * This function does not activate the device. The device will be returned
 282 * whether or not it is activated.
 283 *
 284 * @if_type:    Interface type (enum if_type_t)
 285 * @devnum:     Device number (specific to each interface type)
 286 * @devp:       the device, if found
 287 * @return 0 if found, -ENODEV if no device found, or other -ve error value
 288 */
 289int blk_find_device(int if_type, int devnum, struct udevice **devp);
 290
 291/**
 292 * blk_get_device() - Find and probe a block device ready for use
 293 *
 294 * @if_type:    Interface type (enum if_type_t)
 295 * @devnum:     Device number (specific to each interface type)
 296 * @devp:       the device, if found
 297 * @return 0 if found, -ENODEV if no device found, or other -ve error value
 298 */
 299int blk_get_device(int if_type, int devnum, struct udevice **devp);
 300
 301/**
 302 * blk_first_device() - Find the first device for a given interface
 303 *
 304 * The device is probed ready for use
 305 *
 306 * @devnum:     Device number (specific to each interface type)
 307 * @devp:       the device, if found
 308 * @return 0 if found, -ENODEV if no device, or other -ve error value
 309 */
 310int blk_first_device(int if_type, struct udevice **devp);
 311
 312/**
 313 * blk_next_device() - Find the next device for a given interface
 314 *
 315 * This can be called repeatedly after blk_first_device() to iterate through
 316 * all devices of the given interface type.
 317 *
 318 * The device is probed ready for use
 319 *
 320 * @devp:       On entry, the previous device returned. On exit, the next
 321 *              device, if found
 322 * @return 0 if found, -ENODEV if no device, or other -ve error value
 323 */
 324int blk_next_device(struct udevice **devp);
 325
 326/**
 327 * blk_create_device() - Create a new block device
 328 *
 329 * @parent:     Parent of the new device
 330 * @drv_name:   Driver name to use for the block device
 331 * @name:       Name for the device
 332 * @if_type:    Interface type (enum if_type_t)
 333 * @devnum:     Device number, specific to the interface type, or -1 to
 334 *              allocate the next available number
 335 * @blksz:      Block size of the device in bytes (typically 512)
 336 * @lba:        Total number of blocks of the device
 337 * @devp:       the new device (which has not been probed)
 338 */
 339int blk_create_device(struct udevice *parent, const char *drv_name,
 340                      const char *name, int if_type, int devnum, int blksz,
 341                      lbaint_t lba, struct udevice **devp);
 342
 343/**
 344 * blk_create_devicef() - Create a new named block device
 345 *
 346 * @parent:     Parent of the new device
 347 * @drv_name:   Driver name to use for the block device
 348 * @name:       Name for the device (parent name is prepended)
 349 * @if_type:    Interface type (enum if_type_t)
 350 * @devnum:     Device number, specific to the interface type, or -1 to
 351 *              allocate the next available number
 352 * @blksz:      Block size of the device in bytes (typically 512)
 353 * @lba:        Total number of blocks of the device
 354 * @devp:       the new device (which has not been probed)
 355 */
 356int blk_create_devicef(struct udevice *parent, const char *drv_name,
 357                       const char *name, int if_type, int devnum, int blksz,
 358                       lbaint_t lba, struct udevice **devp);
 359
 360/**
 361 * blk_unbind_all() - Unbind all device of the given interface type
 362 *
 363 * The devices are removed and then unbound.
 364 *
 365 * @if_type:    Interface type to unbind
 366 * @return 0 if OK, -ve on error
 367 */
 368int blk_unbind_all(int if_type);
 369
 370/**
 371 * blk_find_max_devnum() - find the maximum device number for an interface type
 372 *
 373 * Finds the last allocated device number for an interface type @if_type. The
 374 * next number is safe to use for a newly allocated device.
 375 *
 376 * @if_type:    Interface type to scan
 377 * @return maximum device number found, or -ENODEV if none, or other -ve on
 378 * error
 379 */
 380int blk_find_max_devnum(enum if_type if_type);
 381
 382/**
 383 * blk_next_free_devnum() - get the next device number for an interface type
 384 *
 385 * Finds the next number that is safe to use for a newly allocated device for
 386 * an interface type @if_type.
 387 *
 388 * @if_type:    Interface type to scan
 389 * @return next device number safe to use, or -ve on error
 390 */
 391int blk_next_free_devnum(enum if_type if_type);
 392
 393/**
 394 * blk_select_hwpart() - select a hardware partition
 395 *
 396 * Select a hardware partition if the device supports it (typically MMC does)
 397 *
 398 * @dev:        Device to update
 399 * @hwpart:     Partition number to select
 400 * @return 0 if OK, -ve on error
 401 */
 402int blk_select_hwpart(struct udevice *dev, int hwpart);
 403
 404/**
 405 * blk_get_from_parent() - obtain a block device by looking up its parent
 406 *
 407 * All devices with
 408 */
 409int blk_get_from_parent(struct udevice *parent, struct udevice **devp);
 410
 411/**
 412 * blk_get_by_device() - Get the block device descriptor for the given device
 413 * @dev:        Instance of a storage device
 414 *
 415 * Return: With block device descriptor on success , NULL if there is no such
 416 *         block device.
 417 */
 418struct blk_desc *blk_get_by_device(struct udevice *dev);
 419
 420#else
 421#include <errno.h>
 422/*
 423 * These functions should take struct udevice instead of struct blk_desc,
 424 * but this is convenient for migration to driver model. Add a 'd' prefix
 425 * to the function operations, so that blk_read(), etc. can be reserved for
 426 * functions with the correct arguments.
 427 */
 428static inline ulong blk_dread(struct blk_desc *block_dev, lbaint_t start,
 429                              lbaint_t blkcnt, void *buffer)
 430{
 431        ulong blks_read;
 432        if (blkcache_read(block_dev->if_type, block_dev->devnum,
 433                          start, blkcnt, block_dev->blksz, buffer))
 434                return blkcnt;
 435
 436        /*
 437         * We could check if block_read is NULL and return -ENOSYS. But this
 438         * bloats the code slightly (cause some board to fail to build), and
 439         * it would be an error to try an operation that does not exist.
 440         */
 441        blks_read = block_dev->block_read(block_dev, start, blkcnt, buffer);
 442        if (blks_read == blkcnt)
 443                blkcache_fill(block_dev->if_type, block_dev->devnum,
 444                              start, blkcnt, block_dev->blksz, buffer);
 445
 446        return blks_read;
 447}
 448
 449static inline ulong blk_dwrite(struct blk_desc *block_dev, lbaint_t start,
 450                               lbaint_t blkcnt, const void *buffer)
 451{
 452        blkcache_invalidate(block_dev->if_type, block_dev->devnum);
 453        return block_dev->block_write(block_dev, start, blkcnt, buffer);
 454}
 455
 456static inline ulong blk_derase(struct blk_desc *block_dev, lbaint_t start,
 457                               lbaint_t blkcnt)
 458{
 459        blkcache_invalidate(block_dev->if_type, block_dev->devnum);
 460        return block_dev->block_erase(block_dev, start, blkcnt);
 461}
 462
 463/**
 464 * struct blk_driver - Driver for block interface types
 465 *
 466 * This provides access to the block devices for each interface type. One
 467 * driver should be provided using U_BOOT_LEGACY_BLK() for each interface
 468 * type that is to be supported.
 469 *
 470 * @if_typename:        Interface type name
 471 * @if_type:            Interface type
 472 * @max_devs:           Maximum number of devices supported
 473 * @desc:               Pointer to list of devices for this interface type,
 474 *                      or NULL to use @get_dev() instead
 475 */
 476struct blk_driver {
 477        const char *if_typename;
 478        enum if_type if_type;
 479        int max_devs;
 480        struct blk_desc *desc;
 481        /**
 482         * get_dev() - get a pointer to a block device given its number
 483         *
 484         * Each interface allocates its own devices and typically
 485         * struct blk_desc is contained with the interface's data structure.
 486         * There is no global numbering for block devices. This method allows
 487         * the device for an interface type to be obtained when @desc is NULL.
 488         *
 489         * @devnum:     Device number (0 for first device on that interface,
 490         *              1 for second, etc.
 491         * @descp:      Returns pointer to the block device on success
 492         * @return 0 if OK, -ve on error
 493         */
 494        int (*get_dev)(int devnum, struct blk_desc **descp);
 495
 496        /**
 497         * select_hwpart() - Select a hardware partition
 498         *
 499         * Some devices (e.g. MMC) can support partitioning at the hardware
 500         * level. This is quite separate from the normal idea of
 501         * software-based partitions. MMC hardware partitions must be
 502         * explicitly selected. Once selected only the region of the device
 503         * covered by that partition is accessible.
 504         *
 505         * The MMC standard provides for two boot partitions (numbered 1 and 2),
 506         * rpmb (3), and up to 4 addition general-purpose partitions (4-7).
 507         * Partition 0 is the main user-data partition.
 508         *
 509         * @desc:       Block device descriptor
 510         * @hwpart:     Hardware partition number to select. 0 means the main
 511         *              user-data partition, 1 is the first partition, 2 is
 512         *              the second, etc.
 513         * @return 0 if OK, other value for an error
 514         */
 515        int (*select_hwpart)(struct blk_desc *desc, int hwpart);
 516};
 517
 518/*
 519 * Declare a new U-Boot legacy block driver. New drivers should use driver
 520 * model (UCLASS_BLK).
 521 */
 522#define U_BOOT_LEGACY_BLK(__name)                                       \
 523        ll_entry_declare(struct blk_driver, __name, blk_driver)
 524
 525struct blk_driver *blk_driver_lookup_type(int if_type);
 526
 527#endif /* !CONFIG_BLK */
 528
 529/**
 530 * blk_get_devnum_by_typename() - Get a block device by type and number
 531 *
 532 * This looks through the available block devices of the given type, returning
 533 * the one with the given @devnum.
 534 *
 535 * @if_type:    Block device type
 536 * @devnum:     Device number
 537 * @return point to block device descriptor, or NULL if not found
 538 */
 539struct blk_desc *blk_get_devnum_by_type(enum if_type if_type, int devnum);
 540
 541/**
 542 * blk_get_devnum_by_type() - Get a block device by type name, and number
 543 *
 544 * This looks up the block device type based on @if_typename, then calls
 545 * blk_get_devnum_by_type().
 546 *
 547 * @if_typename:        Block device type name
 548 * @devnum:             Device number
 549 * @return point to block device descriptor, or NULL if not found
 550 */
 551struct blk_desc *blk_get_devnum_by_typename(const char *if_typename,
 552                                            int devnum);
 553
 554/**
 555 * blk_dselect_hwpart() - select a hardware partition
 556 *
 557 * This selects a hardware partition (such as is supported by MMC). The block
 558 * device size may change as this effectively points the block device to a
 559 * partition at the hardware level. See the select_hwpart() method above.
 560 *
 561 * @desc:       Block device descriptor for the device to select
 562 * @hwpart:     Partition number to select
 563 * @return 0 if OK, -ve on error
 564 */
 565int blk_dselect_hwpart(struct blk_desc *desc, int hwpart);
 566
 567/**
 568 * blk_list_part() - list the partitions for block devices of a given type
 569 *
 570 * This looks up the partition type for each block device of type @if_type,
 571 * then displays a list of partitions.
 572 *
 573 * @if_type:    Block device type
 574 * @return 0 if OK, -ENODEV if there is none of that type
 575 */
 576int blk_list_part(enum if_type if_type);
 577
 578/**
 579 * blk_list_devices() - list the block devices of a given type
 580 *
 581 * This lists each block device of the type @if_type, showing the capacity
 582 * as well as type-specific information.
 583 *
 584 * @if_type:    Block device type
 585 */
 586void blk_list_devices(enum if_type if_type);
 587
 588/**
 589 * blk_show_device() - show information about a given block device
 590 *
 591 * This shows the block device capacity as well as type-specific information.
 592 *
 593 * @if_type:    Block device type
 594 * @devnum:     Device number
 595 * @return 0 if OK, -ENODEV for invalid device number
 596 */
 597int blk_show_device(enum if_type if_type, int devnum);
 598
 599/**
 600 * blk_print_device_num() - show information about a given block device
 601 *
 602 * This is similar to blk_show_device() but returns an error if the block
 603 * device type is unknown.
 604 *
 605 * @if_type:    Block device type
 606 * @devnum:     Device number
 607 * @return 0 if OK, -ENODEV for invalid device number, -ENOENT if the block
 608 * device is not connected
 609 */
 610int blk_print_device_num(enum if_type if_type, int devnum);
 611
 612/**
 613 * blk_print_part_devnum() - print the partition information for a device
 614 *
 615 * @if_type:    Block device type
 616 * @devnum:     Device number
 617 * @return 0 if OK, -ENOENT if the block device is not connected, -ENOSYS if
 618 * the interface type is not supported, other -ve on other error
 619 */
 620int blk_print_part_devnum(enum if_type if_type, int devnum);
 621
 622/**
 623 * blk_read_devnum() - read blocks from a device
 624 *
 625 * @if_type:    Block device type
 626 * @devnum:     Device number
 627 * @blkcnt:     Number of blocks to read
 628 * @buffer:     Address to write data to
 629 * @return number of blocks read, or -ve error number on error
 630 */
 631ulong blk_read_devnum(enum if_type if_type, int devnum, lbaint_t start,
 632                      lbaint_t blkcnt, void *buffer);
 633
 634/**
 635 * blk_write_devnum() - write blocks to a device
 636 *
 637 * @if_type:    Block device type
 638 * @devnum:     Device number
 639 * @blkcnt:     Number of blocks to write
 640 * @buffer:     Address to read data from
 641 * @return number of blocks written, or -ve error number on error
 642 */
 643ulong blk_write_devnum(enum if_type if_type, int devnum, lbaint_t start,
 644                       lbaint_t blkcnt, const void *buffer);
 645
 646/**
 647 * blk_select_hwpart_devnum() - select a hardware partition
 648 *
 649 * This is similar to blk_dselect_hwpart() but it looks up the interface and
 650 * device number.
 651 *
 652 * @if_type:    Block device type
 653 * @devnum:     Device number
 654 * @hwpart:     Partition number to select
 655 * @return 0 if OK, -ve on error
 656 */
 657int blk_select_hwpart_devnum(enum if_type if_type, int devnum, int hwpart);
 658
 659/**
 660 * blk_get_if_type_name() - Get the name of an interface type
 661 *
 662 * @if_type: Interface type to check
 663 * @return name of interface, or NULL if none
 664 */
 665const char *blk_get_if_type_name(enum if_type if_type);
 666
 667/**
 668 * blk_common_cmd() - handle common commands with block devices
 669 *
 670 * @args: Number of arguments to the command (argv[0] is the command itself)
 671 * @argv: Command arguments
 672 * @if_type: Interface type
 673 * @cur_devnump: Current device number for this interface type
 674 * @return 0 if OK, CMD_RET_ERROR on error
 675 */
 676int blk_common_cmd(int argc, char * const argv[], enum if_type if_type,
 677                   int *cur_devnump);
 678
 679#endif
 680