summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Granaghan <granaghan@google.com>2023-04-05 20:20:43 +0000
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-04-13 19:11:18 +0000
commit20ee1fabc83507d6fb5786441b22b8c4a0bfdfb9 (patch)
tree4d95564a38975ab81bf19b9288c21ae77c245d9d
parent92026fc84fab67bb0ee9b66b635cafb436165d8d (diff)
downloadchrome-ec-20ee1fabc83507d6fb5786441b22b8c4a0bfdfb9.tar.gz
gsctool: Add command to get or set factory config.
Add '--factory_config' command to get the factory config if optarg is not provided and set it if one is provided. BUG=b:275356839 TEST=localhost ~ # gsctool -a --factory_config EEDDCCBBAA998877 Failed because already set: localhost ~ # gsctool -a --factory_config 001122334455667788 Factory config failed. (7) Successful set: localhost ~ # gsctool -a --factory_config 0 localhost ~ # gsctool -a --factory_config 001122334455667788 localhost ~ # gsctool -a --factory_config 1122334455667788 Change-Id: I128e9871eb2aece3a9173c5a6e31c2ce5a4d3cd0 Signed-off-by: Brian Granaghan <granaghan@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4404231 Commit-Queue: Mary Ruthven <mruthven@chromium.org> Reviewed-by: Mary Ruthven <mruthven@chromium.org> Tested-by: Mary Ruthven <mruthven@chromium.org>
-rw-r--r--extra/usb_updater/gsctool.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/extra/usb_updater/gsctool.c b/extra/usb_updater/gsctool.c
index da668fec8a..95b977c695 100644
--- a/extra/usb_updater/gsctool.c
+++ b/extra/usb_updater/gsctool.c
@@ -524,6 +524,9 @@ static const struct option_container cmd_line_options[] = {
"[enable] Get the current WP setting or enable WP"},
{{"clog", no_argument, NULL, 'x'},
"Retrieve contents of the most recent crash log."},
+ {{"factory_config", optional_argument, NULL, 'y'},
+ "[value]%Sets the factory config bits in INFO. value should be 64 "
+ "bit hex."},
{{"reboot", optional_argument, NULL, 'z'},
"Tell the GSC to reboot with an optional reset timeout parameter "
"in milliseconds"},
@@ -3946,6 +3949,46 @@ static int get_console_logs(struct transfer_descriptor *td)
return 0;
}
+static int process_get_factory_config(struct transfer_descriptor *td)
+{
+ uint32_t rv;
+ uint64_t response = 0;
+ size_t response_size = sizeof(response);
+
+ rv = send_vendor_command(td, VENDOR_CC_GET_FACTORY_CONFIG, NULL,
+ 0, (uint8_t *) &response, &response_size);
+ if (rv != VENDOR_RC_SUCCESS) {
+ printf("Set factory config failed. (%X)\n", rv);
+ return 1;
+ }
+
+ if (response_size < sizeof(uint64_t)) {
+ printf("Unexpected response size. (%zu)", response_size);
+ return 2;
+ }
+
+ uint64_t out = be64toh(response);
+
+ printf("%"PRIX64"\n", out);
+ return 0;
+}
+
+static int process_set_factory_config(struct transfer_descriptor *td,
+ uint64_t val)
+{
+ uint64_t val_be = htobe64(val);
+ uint32_t rv;
+
+ rv = send_vendor_command(td, VENDOR_CC_SET_FACTORY_CONFIG, &val_be,
+ sizeof(val_be), NULL, NULL);
+ if (rv != VENDOR_RC_SUCCESS) {
+ printf("Factory config failed. (%X)\n", rv);
+ return 1;
+ }
+
+ return 0;
+}
+
int main(int argc, char *argv[])
{
@@ -4010,6 +4053,9 @@ int main(int argc, char *argv[])
size_t reboot_gsc_timeout = 0;
int get_clog = 0;
int get_console = 0;
+ int factory_config = 0;
+ int set_factory_config = 0;
+ uint64_t factory_config_arg = 0;
/*
* All options which result in setting a Boolean flag to True, along
@@ -4243,6 +4289,13 @@ int main(int argc, char *argv[])
case 'x':
get_clog = 1;
break;
+ case 'y':
+ factory_config = 1;
+ if (optarg) {
+ set_factory_config = 1;
+ factory_config_arg = strtoull(optarg, NULL, 16);
+ }
+ break;
case 'z':
reboot_gsc = true;
/* Set a 1ms default reboot time to avoid libusb errors
@@ -4302,6 +4355,7 @@ int main(int argc, char *argv[])
!get_console &&
!get_flog &&
!get_endorsement_seed &&
+ !factory_config &&
!factory_mode &&
!erase_ap_ro_hash &&
!password &&
@@ -4461,6 +4515,14 @@ int main(int argc, char *argv[])
if (get_console)
exit(get_console_logs(&td));
+ if (factory_config) {
+ if (set_factory_config)
+ exit(process_set_factory_config(&td,
+ factory_config_arg));
+ else
+ exit(process_get_factory_config(&td));
+ }
+
if (data || show_fw_ver) {
setup_connection(&td);