| /* | 
 |  * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. | 
 |  * | 
 |  * SPDX-License-Identifier:	GPL-2.0+ | 
 |  */ | 
 |  | 
 | /* | 
 |  * CBFS commands | 
 |  */ | 
 | #include <common.h> | 
 | #include <command.h> | 
 | #include <cbfs.h> | 
 |  | 
 | int do_cbfs_init(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) | 
 | { | 
 | 	uintptr_t end_of_rom = 0xffffffff; | 
 | 	char *ep; | 
 |  | 
 | 	if (argc > 2) { | 
 | 		printf("usage: cbfsls [end of rom]>\n"); | 
 | 		return 0; | 
 | 	} | 
 | 	if (argc == 2) { | 
 | 		end_of_rom = (int)simple_strtoul(argv[1], &ep, 16); | 
 | 		if (*ep) { | 
 | 			puts("\n** Invalid end of ROM **\n"); | 
 | 			return 1; | 
 | 		} | 
 | 	} | 
 | 	file_cbfs_init(end_of_rom); | 
 | 	if (file_cbfs_result != CBFS_SUCCESS) { | 
 | 		printf("%s.\n", file_cbfs_error()); | 
 | 		return 1; | 
 | 	} | 
 | 	return 0; | 
 | } | 
 |  | 
 | U_BOOT_CMD( | 
 | 	cbfsinit,	2,	0,	do_cbfs_init, | 
 | 	"initialize the cbfs driver", | 
 | 	"[end of rom]\n" | 
 | 	"    - Initialize the cbfs driver. The optional 'end of rom'\n" | 
 | 	"      parameter specifies where the end of the ROM is that the\n" | 
 | 	"      CBFS is in. It defaults to 0xFFFFFFFF\n" | 
 | ); | 
 |  | 
 | int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) | 
 | { | 
 | 	const struct cbfs_cachenode *file; | 
 | 	unsigned long offset; | 
 | 	unsigned long count; | 
 | 	long size; | 
 |  | 
 | 	if (argc < 3) { | 
 | 		printf("usage: cbfsload <addr> <filename> [bytes]\n"); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	/* parse offset and count */ | 
 | 	offset = simple_strtoul(argv[1], NULL, 16); | 
 | 	if (argc == 4) | 
 | 		count = simple_strtoul(argv[3], NULL, 16); | 
 | 	else | 
 | 		count = 0; | 
 |  | 
 | 	file = file_cbfs_find(argv[2]); | 
 | 	if (!file) { | 
 | 		if (file_cbfs_result == CBFS_FILE_NOT_FOUND) | 
 | 			printf("%s: %s\n", file_cbfs_error(), argv[2]); | 
 | 		else | 
 | 			printf("%s.\n", file_cbfs_error()); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	printf("reading %s\n", file_cbfs_name(file)); | 
 |  | 
 | 	size = file_cbfs_read(file, (void *)offset, count); | 
 |  | 
 | 	printf("\n%ld bytes read\n", size); | 
 |  | 
 | 	setenv_hex("filesize", size); | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | U_BOOT_CMD( | 
 | 	cbfsload,	4,	0,	do_cbfs_fsload, | 
 | 	"load binary file from a cbfs filesystem", | 
 | 	"<addr> <filename> [bytes]\n" | 
 | 	"    - load binary file 'filename' from the cbfs to address 'addr'\n" | 
 | ); | 
 |  | 
 | int do_cbfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) | 
 | { | 
 | 	const struct cbfs_cachenode *file = file_cbfs_get_first(); | 
 | 	int files = 0; | 
 |  | 
 | 	if (!file) { | 
 | 		printf("%s.\n", file_cbfs_error()); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	printf("     size              type  name\n"); | 
 | 	printf("------------------------------------------\n"); | 
 | 	while (file) { | 
 | 		u32 type = file_cbfs_type(file); | 
 | 		char *type_name = NULL; | 
 | 		const char *filename = file_cbfs_name(file); | 
 |  | 
 | 		printf(" %8d", file_cbfs_size(file)); | 
 |  | 
 | 		switch (type) { | 
 | 		case CBFS_TYPE_STAGE: | 
 | 			type_name = "stage"; | 
 | 			break; | 
 | 		case CBFS_TYPE_PAYLOAD: | 
 | 			type_name = "payload"; | 
 | 			break; | 
 | 		case CBFS_TYPE_OPTIONROM: | 
 | 			type_name = "option rom"; | 
 | 			break; | 
 | 		case CBFS_TYPE_BOOTSPLASH: | 
 | 			type_name = "boot splash"; | 
 | 			break; | 
 | 		case CBFS_TYPE_RAW: | 
 | 			type_name = "raw"; | 
 | 			break; | 
 | 		case CBFS_TYPE_VSA: | 
 | 			type_name = "vsa"; | 
 | 			break; | 
 | 		case CBFS_TYPE_MBI: | 
 | 			type_name = "mbi"; | 
 | 			break; | 
 | 		case CBFS_TYPE_MICROCODE: | 
 | 			type_name = "microcode"; | 
 | 			break; | 
 | 		case CBFS_COMPONENT_CMOS_DEFAULT: | 
 | 			type_name = "cmos default"; | 
 | 			break; | 
 | 		case CBFS_COMPONENT_CMOS_LAYOUT: | 
 | 			type_name = "cmos layout"; | 
 | 			break; | 
 | 		case -1UL: | 
 | 			type_name = "null"; | 
 | 			break; | 
 | 		} | 
 | 		if (type_name) | 
 | 			printf("  %16s", type_name); | 
 | 		else | 
 | 			printf("  %16d", type); | 
 |  | 
 | 		if (filename[0]) | 
 | 			printf("  %s\n", filename); | 
 | 		else | 
 | 			printf("  %s\n", "(empty)"); | 
 | 		file_cbfs_get_next(&file); | 
 | 		files++; | 
 | 	} | 
 |  | 
 | 	printf("\n%d file(s)\n\n", files); | 
 | 	return 0; | 
 | } | 
 |  | 
 | U_BOOT_CMD( | 
 | 	cbfsls,	1,	1,	do_cbfs_ls, | 
 | 	"list files", | 
 | 	"    - list the files in the cbfs\n" | 
 | ); | 
 |  | 
 | int do_cbfs_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) | 
 | { | 
 | 	const struct cbfs_header *header = file_cbfs_get_header(); | 
 |  | 
 | 	if (!header) { | 
 | 		printf("%s.\n", file_cbfs_error()); | 
 | 		return 1; | 
 | 	} | 
 |  | 
 | 	printf("\n"); | 
 | 	printf("CBFS version: %#x\n", header->version); | 
 | 	printf("ROM size: %#x\n", header->rom_size); | 
 | 	printf("Boot block size: %#x\n", header->boot_block_size); | 
 | 	printf("CBFS size: %#x\n", | 
 | 		header->rom_size - header->boot_block_size - header->offset); | 
 | 	printf("Alignment: %d\n", header->align); | 
 | 	printf("Offset: %#x\n", header->offset); | 
 | 	printf("\n"); | 
 |  | 
 | 	return 0; | 
 | } | 
 |  | 
 | U_BOOT_CMD( | 
 | 	cbfsinfo,	1,	1,	do_cbfs_fsinfo, | 
 | 	"print information about filesystem", | 
 | 	"    - print information about the cbfs filesystem\n" | 
 | ); |