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