cli_classic: Add convenient '--flash-name' cli opt

We have this in the ChromiumOS fork of flashrom which we rely
on to obtain the current flash chip in use. This ports it for
upstream consumption.

V.2: Constrain number_of_operations to one as per Nico's comment.
V.3: Move two goto's outside inner if-else block.
V.4: Add missing --help line.
V.5: Add man page entry.
v.6: Use printf() directly.

Change-Id: I23d574a2f8eaf809a5c0524490db9e3a560ede56
Signed-off-by: Edward O'Callaghan <quasisec@chromium.org>
Reviewed-on: https://review.coreboot.org/c/flashrom/+/35591
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
diff --git a/cli_classic.c b/cli_classic.c
index b4112fd..5dff904 100644
--- a/cli_classic.c
+++ b/cli_classic.c
@@ -51,6 +51,7 @@
 	       " -n | --noverify                    don't auto-verify\n"
 	       " -N | --noverify-all                verify included regions only (cf. -i)\n"
 	       " -l | --layout <layoutfile>         read ROM layout from <layoutfile>\n"
+	       "      --flash-name                  read out the detected flash name\n"
 	       "      --fmap                        read ROM layout from fmap embedded in ROM\n"
 	       "      --fmap-file <fmapfile>        read ROM layout from fmap in <fmapfile>\n"
 	       "      --ifd                         read layout from an Intel Firmware Descriptor\n"
@@ -101,6 +102,7 @@
 #if CONFIG_PRINT_WIKI == 1
 	int list_supported_wiki = 0;
 #endif
+	int flash_name = 0;
 	int read_it = 0, write_it = 0, erase_it = 0, verify_it = 0;
 	int dont_verify_it = 0, dont_verify_all = 0, list_supported = 0, operation_specified = 0;
 	struct flashrom_layout *layout = NULL;
@@ -110,6 +112,7 @@
 		OPTION_FMAP,
 		OPTION_FMAP_FILE,
 		OPTION_FLASH_CONTENTS,
+		OPTION_FLASH_NAME,
 	};
 	int ret = 0;
 
@@ -130,6 +133,7 @@
 		{"fmap-file",		1, NULL, OPTION_FMAP_FILE},
 		{"image",		1, NULL, 'i'},
 		{"flash-contents",	1, NULL, OPTION_FLASH_CONTENTS},
+		{"flash-name",		0, NULL, OPTION_FLASH_NAME},
 		{"list-supported",	0, NULL, 'L'},
 		{"list-supported-wiki",	0, NULL, 'z'},
 		{"programmer",		1, NULL, 'p'},
@@ -296,6 +300,14 @@
 		case OPTION_FLASH_CONTENTS:
 			referencefile = strdup(optarg);
 			break;
+		case OPTION_FLASH_NAME:
+			if (++operation_specified > 1) {
+				fprintf(stderr, "More than one operation "
+					"specified. Aborting.\n");
+				cli_classic_abort_usage();
+			}
+			flash_name = 1;
+			break;
 		case 'L':
 			if (++operation_specified > 1) {
 				fprintf(stderr, "More than one operation "
@@ -602,11 +614,22 @@
 		goto out_shutdown;
 	}
 
-	if (!(read_it | write_it | verify_it | erase_it)) {
+	if (!(read_it | write_it | verify_it | erase_it | flash_name)) {
 		msg_ginfo("No operations were specified.\n");
 		goto out_shutdown;
 	}
 
+	if (flash_name) {
+		if (fill_flash->chip->vendor && fill_flash->chip->name) {
+			printf("vendor=\"%s\" name=\"%s\"\n",
+				fill_flash->chip->vendor,
+				fill_flash->chip->name);
+		} else {
+			ret = -1;
+		}
+		goto out_shutdown;
+	}
+
 	if (layoutfile) {
 		layout = get_global_layout();
 	} else if (ifd && (flashrom_layout_read_from_ifd(&layout, fill_flash, NULL, 0) ||