183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+ 22e192b24SSimon Glass /* 32e192b24SSimon Glass * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 42e192b24SSimon Glass */ 52e192b24SSimon Glass 62e192b24SSimon Glass /* 72e192b24SSimon Glass * CBFS commands 82e192b24SSimon Glass */ 92e192b24SSimon Glass #include <common.h> 102e192b24SSimon Glass #include <command.h> 112e192b24SSimon Glass #include <cbfs.h> 122e192b24SSimon Glass 13633fb736SSimon Glass static int do_cbfs_init(cmd_tbl_t *cmdtp, int flag, int argc, 14633fb736SSimon Glass char *const argv[]) 152e192b24SSimon Glass { 162e192b24SSimon Glass uintptr_t end_of_rom = 0xffffffff; 172e192b24SSimon Glass char *ep; 182e192b24SSimon Glass 192e192b24SSimon Glass if (argc > 2) { 202e192b24SSimon Glass printf("usage: cbfsls [end of rom]>\n"); 212e192b24SSimon Glass return 0; 222e192b24SSimon Glass } 232e192b24SSimon Glass if (argc == 2) { 2433222c8aSAndre Heider end_of_rom = simple_strtoul(argv[1], &ep, 16); 252e192b24SSimon Glass if (*ep) { 262e192b24SSimon Glass puts("\n** Invalid end of ROM **\n"); 272e192b24SSimon Glass return 1; 282e192b24SSimon Glass } 292e192b24SSimon Glass } 302e192b24SSimon Glass file_cbfs_init(end_of_rom); 312e192b24SSimon Glass if (file_cbfs_result != CBFS_SUCCESS) { 322e192b24SSimon Glass printf("%s.\n", file_cbfs_error()); 332e192b24SSimon Glass return 1; 342e192b24SSimon Glass } 352e192b24SSimon Glass return 0; 362e192b24SSimon Glass } 372e192b24SSimon Glass 382e192b24SSimon Glass U_BOOT_CMD( 392e192b24SSimon Glass cbfsinit, 2, 0, do_cbfs_init, 402e192b24SSimon Glass "initialize the cbfs driver", 412e192b24SSimon Glass "[end of rom]\n" 422e192b24SSimon Glass " - Initialize the cbfs driver. The optional 'end of rom'\n" 432e192b24SSimon Glass " parameter specifies where the end of the ROM is that the\n" 442e192b24SSimon Glass " CBFS is in. It defaults to 0xFFFFFFFF\n" 452e192b24SSimon Glass ); 462e192b24SSimon Glass 47633fb736SSimon Glass static int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, 48633fb736SSimon Glass char *const argv[]) 492e192b24SSimon Glass { 502e192b24SSimon Glass const struct cbfs_cachenode *file; 512e192b24SSimon Glass unsigned long offset; 522e192b24SSimon Glass unsigned long count; 532e192b24SSimon Glass long size; 542e192b24SSimon Glass 552e192b24SSimon Glass if (argc < 3) { 562e192b24SSimon Glass printf("usage: cbfsload <addr> <filename> [bytes]\n"); 572e192b24SSimon Glass return 1; 582e192b24SSimon Glass } 592e192b24SSimon Glass 602e192b24SSimon Glass /* parse offset and count */ 612e192b24SSimon Glass offset = simple_strtoul(argv[1], NULL, 16); 622e192b24SSimon Glass if (argc == 4) 632e192b24SSimon Glass count = simple_strtoul(argv[3], NULL, 16); 642e192b24SSimon Glass else 652e192b24SSimon Glass count = 0; 662e192b24SSimon Glass 672e192b24SSimon Glass file = file_cbfs_find(argv[2]); 682e192b24SSimon Glass if (!file) { 692e192b24SSimon Glass if (file_cbfs_result == CBFS_FILE_NOT_FOUND) 702e192b24SSimon Glass printf("%s: %s\n", file_cbfs_error(), argv[2]); 712e192b24SSimon Glass else 722e192b24SSimon Glass printf("%s.\n", file_cbfs_error()); 732e192b24SSimon Glass return 1; 742e192b24SSimon Glass } 752e192b24SSimon Glass 762e192b24SSimon Glass printf("reading %s\n", file_cbfs_name(file)); 772e192b24SSimon Glass 782e192b24SSimon Glass size = file_cbfs_read(file, (void *)offset, count); 792e192b24SSimon Glass 802e192b24SSimon Glass printf("\n%ld bytes read\n", size); 812e192b24SSimon Glass 82018f5303SSimon Glass env_set_hex("filesize", size); 832e192b24SSimon Glass 842e192b24SSimon Glass return 0; 852e192b24SSimon Glass } 862e192b24SSimon Glass 872e192b24SSimon Glass U_BOOT_CMD( 882e192b24SSimon Glass cbfsload, 4, 0, do_cbfs_fsload, 892e192b24SSimon Glass "load binary file from a cbfs filesystem", 902e192b24SSimon Glass "<addr> <filename> [bytes]\n" 912e192b24SSimon Glass " - load binary file 'filename' from the cbfs to address 'addr'\n" 922e192b24SSimon Glass ); 932e192b24SSimon Glass 94633fb736SSimon Glass static int do_cbfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, 95633fb736SSimon Glass char *const argv[]) 962e192b24SSimon Glass { 972e192b24SSimon Glass const struct cbfs_cachenode *file = file_cbfs_get_first(); 982e192b24SSimon Glass int files = 0; 992e192b24SSimon Glass 1002e192b24SSimon Glass if (!file) { 1012e192b24SSimon Glass printf("%s.\n", file_cbfs_error()); 1022e192b24SSimon Glass return 1; 1032e192b24SSimon Glass } 1042e192b24SSimon Glass 1052e192b24SSimon Glass printf(" size type name\n"); 1062e192b24SSimon Glass printf("------------------------------------------\n"); 1072e192b24SSimon Glass while (file) { 108a696d768SSimon Glass int type = file_cbfs_type(file); 1092e192b24SSimon Glass char *type_name = NULL; 1102e192b24SSimon Glass const char *filename = file_cbfs_name(file); 1112e192b24SSimon Glass 1122e192b24SSimon Glass printf(" %8d", file_cbfs_size(file)); 1132e192b24SSimon Glass 1142e192b24SSimon Glass switch (type) { 1152e192b24SSimon Glass case CBFS_TYPE_STAGE: 1162e192b24SSimon Glass type_name = "stage"; 1172e192b24SSimon Glass break; 1182e192b24SSimon Glass case CBFS_TYPE_PAYLOAD: 1192e192b24SSimon Glass type_name = "payload"; 1202e192b24SSimon Glass break; 1212e192b24SSimon Glass case CBFS_TYPE_OPTIONROM: 1222e192b24SSimon Glass type_name = "option rom"; 1232e192b24SSimon Glass break; 1242e192b24SSimon Glass case CBFS_TYPE_BOOTSPLASH: 1252e192b24SSimon Glass type_name = "boot splash"; 1262e192b24SSimon Glass break; 1272e192b24SSimon Glass case CBFS_TYPE_RAW: 1282e192b24SSimon Glass type_name = "raw"; 1292e192b24SSimon Glass break; 1302e192b24SSimon Glass case CBFS_TYPE_VSA: 1312e192b24SSimon Glass type_name = "vsa"; 1322e192b24SSimon Glass break; 1332e192b24SSimon Glass case CBFS_TYPE_MBI: 1342e192b24SSimon Glass type_name = "mbi"; 1352e192b24SSimon Glass break; 1362e192b24SSimon Glass case CBFS_TYPE_MICROCODE: 1372e192b24SSimon Glass type_name = "microcode"; 1382e192b24SSimon Glass break; 139*14fdf91eSBin Meng case CBFS_TYPE_CMOS_DEFAULT: 1402e192b24SSimon Glass type_name = "cmos default"; 1412e192b24SSimon Glass break; 142*14fdf91eSBin Meng case CBFS_TYPE_CMOS_LAYOUT: 1432e192b24SSimon Glass type_name = "cmos layout"; 1442e192b24SSimon Glass break; 145a696d768SSimon Glass case -1: 146a696d768SSimon Glass case 0: 1472e192b24SSimon Glass type_name = "null"; 1482e192b24SSimon Glass break; 1492e192b24SSimon Glass } 1502e192b24SSimon Glass if (type_name) 1512e192b24SSimon Glass printf(" %16s", type_name); 1522e192b24SSimon Glass else 1532e192b24SSimon Glass printf(" %16d", type); 1542e192b24SSimon Glass 1552e192b24SSimon Glass if (filename[0]) 1562e192b24SSimon Glass printf(" %s\n", filename); 1572e192b24SSimon Glass else 1582e192b24SSimon Glass printf(" %s\n", "(empty)"); 1592e192b24SSimon Glass file_cbfs_get_next(&file); 1602e192b24SSimon Glass files++; 1612e192b24SSimon Glass } 1622e192b24SSimon Glass 1632e192b24SSimon Glass printf("\n%d file(s)\n\n", files); 1642e192b24SSimon Glass return 0; 1652e192b24SSimon Glass } 1662e192b24SSimon Glass 1672e192b24SSimon Glass U_BOOT_CMD( 1682e192b24SSimon Glass cbfsls, 1, 1, do_cbfs_ls, 1692e192b24SSimon Glass "list files", 1702e192b24SSimon Glass " - list the files in the cbfs\n" 1712e192b24SSimon Glass ); 1722e192b24SSimon Glass 173633fb736SSimon Glass static int do_cbfs_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, 174633fb736SSimon Glass char *const argv[]) 1752e192b24SSimon Glass { 1762e192b24SSimon Glass const struct cbfs_header *header = file_cbfs_get_header(); 1772e192b24SSimon Glass 1782e192b24SSimon Glass if (!header) { 1792e192b24SSimon Glass printf("%s.\n", file_cbfs_error()); 1802e192b24SSimon Glass return 1; 1812e192b24SSimon Glass } 1822e192b24SSimon Glass 1832e192b24SSimon Glass printf("\n"); 1842e192b24SSimon Glass printf("CBFS version: %#x\n", header->version); 1852e192b24SSimon Glass printf("ROM size: %#x\n", header->rom_size); 1862e192b24SSimon Glass printf("Boot block size: %#x\n", header->boot_block_size); 1872e192b24SSimon Glass printf("CBFS size: %#x\n", 1882e192b24SSimon Glass header->rom_size - header->boot_block_size - header->offset); 1892e192b24SSimon Glass printf("Alignment: %d\n", header->align); 1902e192b24SSimon Glass printf("Offset: %#x\n", header->offset); 1912e192b24SSimon Glass printf("\n"); 1922e192b24SSimon Glass 1932e192b24SSimon Glass return 0; 1942e192b24SSimon Glass } 1952e192b24SSimon Glass 1962e192b24SSimon Glass U_BOOT_CMD( 1972e192b24SSimon Glass cbfsinfo, 1, 1, do_cbfs_fsinfo, 1982e192b24SSimon Glass "print information about filesystem", 1992e192b24SSimon Glass " - print information about the cbfs filesystem\n" 2002e192b24SSimon Glass ); 201