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 14 int 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 38 U_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 47 int 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 86 U_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 93 int 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 164 U_BOOT_CMD( 165 cbfsls, 1, 1, do_cbfs_ls, 166 "list files", 167 " - list the files in the cbfs\n" 168 ); 169 170 int 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 192 U_BOOT_CMD( 193 cbfsinfo, 1, 1, do_cbfs_fsinfo, 194 "print information about filesystem", 195 " - print information about the cbfs filesystem\n" 196 ); 197