uboot/common/cmd_cbfs.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
   3 *
   4 * SPDX-License-Identifier:     GPL-2.0+
   5 */
   6
   7/*
   8 * CBFS commands
   9 */
  10#include <common.h>
  11#include <command.h>
  12#include <cbfs.h>
  13
  14int do_cbfs_init(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  15{
  16        uintptr_t end_of_rom = 0xffffffff;
  17        char *ep;
  18
  19        if (argc > 2) {
  20                printf("usage: cbfsls [end of rom]>\n");
  21                return 0;
  22        }
  23        if (argc == 2) {
  24                end_of_rom = (int)simple_strtoul(argv[1], &ep, 16);
  25                if (*ep) {
  26                        puts("\n** Invalid end of ROM **\n");
  27                        return 1;
  28                }
  29        }
  30        file_cbfs_init(end_of_rom);
  31        if (file_cbfs_result != CBFS_SUCCESS) {
  32                printf("%s.\n", file_cbfs_error());
  33                return 1;
  34        }
  35        return 0;
  36}
  37
  38U_BOOT_CMD(
  39        cbfsinit,       2,      0,      do_cbfs_init,
  40        "initialize the cbfs driver",
  41        "[end of rom]\n"
  42        "    - Initialize the cbfs driver. The optional 'end of rom'\n"
  43        "      parameter specifies where the end of the ROM is that the\n"
  44        "      CBFS is in. It defaults to 0xFFFFFFFF\n"
  45);
  46
  47int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  48{
  49        const struct cbfs_cachenode *file;
  50        unsigned long offset;
  51        unsigned long count;
  52        long size;
  53
  54        if (argc < 3) {
  55                printf("usage: cbfsload <addr> <filename> [bytes]\n");
  56                return 1;
  57        }
  58
  59        /* parse offset and count */
  60        offset = simple_strtoul(argv[1], NULL, 16);
  61        if (argc == 4)
  62                count = simple_strtoul(argv[3], NULL, 16);
  63        else
  64                count = 0;
  65
  66        file = file_cbfs_find(argv[2]);
  67        if (!file) {
  68                if (file_cbfs_result == CBFS_FILE_NOT_FOUND)
  69                        printf("%s: %s\n", file_cbfs_error(), argv[2]);
  70                else
  71                        printf("%s.\n", file_cbfs_error());
  72                return 1;
  73        }
  74
  75        printf("reading %s\n", file_cbfs_name(file));
  76
  77        size = file_cbfs_read(file, (void *)offset, count);
  78
  79        printf("\n%ld bytes read\n", size);
  80
  81        setenv_hex("filesize", size);
  82
  83        return 0;
  84}
  85
  86U_BOOT_CMD(
  87        cbfsload,       4,      0,      do_cbfs_fsload,
  88        "load binary file from a cbfs filesystem",
  89        "<addr> <filename> [bytes]\n"
  90        "    - load binary file 'filename' from the cbfs to address 'addr'\n"
  91);
  92
  93int do_cbfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
  94{
  95        const struct cbfs_cachenode *file = file_cbfs_get_first();
  96        int files = 0;
  97
  98        if (!file) {
  99                printf("%s.\n", file_cbfs_error());
 100                return 1;
 101        }
 102
 103        printf("     size              type  name\n");
 104        printf("------------------------------------------\n");
 105        while (file) {
 106                u32 type = file_cbfs_type(file);
 107                char *type_name = NULL;
 108                const char *filename = file_cbfs_name(file);
 109
 110                printf(" %8d", file_cbfs_size(file));
 111
 112                switch (type) {
 113                case CBFS_TYPE_STAGE:
 114                        type_name = "stage";
 115                        break;
 116                case CBFS_TYPE_PAYLOAD:
 117                        type_name = "payload";
 118                        break;
 119                case CBFS_TYPE_OPTIONROM:
 120                        type_name = "option rom";
 121                        break;
 122                case CBFS_TYPE_BOOTSPLASH:
 123                        type_name = "boot splash";
 124                        break;
 125                case CBFS_TYPE_RAW:
 126                        type_name = "raw";
 127                        break;
 128                case CBFS_TYPE_VSA:
 129                        type_name = "vsa";
 130                        break;
 131                case CBFS_TYPE_MBI:
 132                        type_name = "mbi";
 133                        break;
 134                case CBFS_TYPE_MICROCODE:
 135                        type_name = "microcode";
 136                        break;
 137                case CBFS_COMPONENT_CMOS_DEFAULT:
 138                        type_name = "cmos default";
 139                        break;
 140                case CBFS_COMPONENT_CMOS_LAYOUT:
 141                        type_name = "cmos layout";
 142                        break;
 143                case -1UL:
 144                        type_name = "null";
 145                        break;
 146                }
 147                if (type_name)
 148                        printf("  %16s", type_name);
 149                else
 150                        printf("  %16d", type);
 151
 152                if (filename[0])
 153                        printf("  %s\n", filename);
 154                else
 155                        printf("  %s\n", "(empty)");
 156                file_cbfs_get_next(&file);
 157                files++;
 158        }
 159
 160        printf("\n%d file(s)\n\n", files);
 161        return 0;
 162}
 163
 164U_BOOT_CMD(
 165        cbfsls, 1,      1,      do_cbfs_ls,
 166        "list files",
 167        "    - list the files in the cbfs\n"
 168);
 169
 170int do_cbfs_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 171{
 172        const struct cbfs_header *header = file_cbfs_get_header();
 173
 174        if (!header) {
 175                printf("%s.\n", file_cbfs_error());
 176                return 1;
 177        }
 178
 179        printf("\n");
 180        printf("CBFS version: %#x\n", header->version);
 181        printf("ROM size: %#x\n", header->rom_size);
 182        printf("Boot block size: %#x\n", header->boot_block_size);
 183        printf("CBFS size: %#x\n",
 184                header->rom_size - header->boot_block_size - header->offset);
 185        printf("Alignment: %d\n", header->align);
 186        printf("Offset: %#x\n", header->offset);
 187        printf("\n");
 188
 189        return 0;
 190}
 191
 192U_BOOT_CMD(
 193        cbfsinfo,       1,      1,      do_cbfs_fsinfo,
 194        "print information about filesystem",
 195        "    - print information about the cbfs filesystem\n"
 196);
 197