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