fastboot: implement "getvar all"

This commit implements "fastboot getvar all" listing
by iterating the existing dispatchers that don't require
parameters (as we pass NULL), uses fastboot multiresponse.

Signed-off-by: Ion Agorria <ion@agorria.com>
Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
Reviewed-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
Link: https://lore.kernel.org/r/20240105072212.6615-3-clamor95@gmail.com
Signed-off-by: Mattijs Korpershoek <mkorpershoek@baylibre.com>
This commit is contained in:
Ion Agorria 2024-01-05 09:22:07 +02:00 committed by Mattijs Korpershoek
parent 85fcd69dc2
commit 475aa9aabe
4 changed files with 77 additions and 13 deletions

View file

@ -173,6 +173,9 @@ The various currently defined names are::
bootloader requiring a signature before bootloader requiring a signature before
it will install or boot images. it will install or boot images.
all Provides all info from commands above as
they were called one by one
Names starting with a lowercase character are reserved by this Names starting with a lowercase character are reserved by this
specification. OEM-specific names should not start with lowercase specification. OEM-specific names should not start with lowercase
characters. characters.

View file

@ -156,6 +156,9 @@ int fastboot_handle_command(char *cmd_string, char *response)
void fastboot_multiresponse(int cmd, char *response) void fastboot_multiresponse(int cmd, char *response)
{ {
switch (cmd) { switch (cmd) {
case FASTBOOT_COMMAND_GETVAR:
fastboot_getvar_all(response);
break;
default: default:
fastboot_fail("Unknown multiresponse command", response); fastboot_fail("Unknown multiresponse command", response);
break; break;

View file

@ -29,53 +29,67 @@ static void getvar_is_userspace(char *var_parameter, char *response);
static const struct { static const struct {
const char *variable; const char *variable;
bool list;
void (*dispatch)(char *var_parameter, char *response); void (*dispatch)(char *var_parameter, char *response);
} getvar_dispatch[] = { } getvar_dispatch[] = {
{ {
.variable = "version", .variable = "version",
.dispatch = getvar_version .dispatch = getvar_version,
.list = true,
}, { }, {
.variable = "version-bootloader", .variable = "version-bootloader",
.dispatch = getvar_version_bootloader .dispatch = getvar_version_bootloader,
.list = true
}, { }, {
.variable = "downloadsize", .variable = "downloadsize",
.dispatch = getvar_downloadsize .dispatch = getvar_downloadsize,
.list = true
}, { }, {
.variable = "max-download-size", .variable = "max-download-size",
.dispatch = getvar_downloadsize .dispatch = getvar_downloadsize,
.list = true
}, { }, {
.variable = "serialno", .variable = "serialno",
.dispatch = getvar_serialno .dispatch = getvar_serialno,
.list = true
}, { }, {
.variable = "version-baseband", .variable = "version-baseband",
.dispatch = getvar_version_baseband .dispatch = getvar_version_baseband,
.list = true
}, { }, {
.variable = "product", .variable = "product",
.dispatch = getvar_product .dispatch = getvar_product,
.list = true
}, { }, {
.variable = "platform", .variable = "platform",
.dispatch = getvar_platform .dispatch = getvar_platform,
.list = true
}, { }, {
.variable = "current-slot", .variable = "current-slot",
.dispatch = getvar_current_slot .dispatch = getvar_current_slot,
.list = true
#if IS_ENABLED(CONFIG_FASTBOOT_FLASH) #if IS_ENABLED(CONFIG_FASTBOOT_FLASH)
}, { }, {
.variable = "has-slot", .variable = "has-slot",
.dispatch = getvar_has_slot .dispatch = getvar_has_slot,
.list = false
#endif #endif
#if IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC) #if IS_ENABLED(CONFIG_FASTBOOT_FLASH_MMC)
}, { }, {
.variable = "partition-type", .variable = "partition-type",
.dispatch = getvar_partition_type .dispatch = getvar_partition_type,
.list = false
#endif #endif
#if IS_ENABLED(CONFIG_FASTBOOT_FLASH) #if IS_ENABLED(CONFIG_FASTBOOT_FLASH)
}, { }, {
.variable = "partition-size", .variable = "partition-size",
.dispatch = getvar_partition_size .dispatch = getvar_partition_size,
.list = false
#endif #endif
}, { }, {
.variable = "is-userspace", .variable = "is-userspace",
.dispatch = getvar_is_userspace .dispatch = getvar_is_userspace,
.list = true
} }
}; };
@ -237,6 +251,40 @@ static void getvar_is_userspace(char *var_parameter, char *response)
fastboot_okay("no", response); fastboot_okay("no", response);
} }
static int current_all_dispatch;
void fastboot_getvar_all(char *response)
{
/*
* Find a dispatch getvar that can be listed and send
* it as INFO until we reach the end.
*/
while (current_all_dispatch < ARRAY_SIZE(getvar_dispatch)) {
if (!getvar_dispatch[current_all_dispatch].list) {
current_all_dispatch++;
continue;
}
char envstr[FASTBOOT_RESPONSE_LEN] = { 0 };
getvar_dispatch[current_all_dispatch].dispatch(NULL, envstr);
char *envstr_start = envstr;
if (!strncmp("OKAY", envstr, 4) || !strncmp("FAIL", envstr, 4))
envstr_start += 4;
fastboot_response("INFO", response, "%s: %s",
getvar_dispatch[current_all_dispatch].variable,
envstr_start);
current_all_dispatch++;
return;
}
fastboot_response("OKAY", response, NULL);
current_all_dispatch = 0;
}
/** /**
* fastboot_getvar() - Writes variable indicated by cmd_parameter to response. * fastboot_getvar() - Writes variable indicated by cmd_parameter to response.
* *
@ -254,6 +302,9 @@ void fastboot_getvar(char *cmd_parameter, char *response)
{ {
if (!cmd_parameter) { if (!cmd_parameter) {
fastboot_fail("missing var", response); fastboot_fail("missing var", response);
} else if (!strncmp("all", cmd_parameter, 3) && strlen(cmd_parameter) == 3) {
current_all_dispatch = 0;
fastboot_response(FASTBOOT_MULTIRESPONSE_START, response, NULL);
} else { } else {
#define FASTBOOT_ENV_PREFIX "fastboot." #define FASTBOOT_ENV_PREFIX "fastboot."
int i; int i;

View file

@ -18,6 +18,13 @@ extern u32 fastboot_buf_size;
*/ */
extern void (*fastboot_progress_callback)(const char *msg); extern void (*fastboot_progress_callback)(const char *msg);
/**
* fastboot_getvar_all() - Writes current variable being listed from "all" to response.
*
* @response: Pointer to fastboot response buffer
*/
void fastboot_getvar_all(char *response);
/** /**
* fastboot_getvar() - Writes variable indicated by cmd_parameter to response. * fastboot_getvar() - Writes variable indicated by cmd_parameter to response.
* *