diff options
Diffstat (limited to 'drivers/fastboot/fb_getvar.c')
| -rw-r--r-- | drivers/fastboot/fb_getvar.c | 103 | 
1 files changed, 79 insertions, 24 deletions
| diff --git a/drivers/fastboot/fb_getvar.c b/drivers/fastboot/fb_getvar.c index 4268628f5ef..bf957e83265 100644 --- a/drivers/fastboot/fb_getvar.c +++ b/drivers/fastboot/fb_getvar.c @@ -20,7 +20,9 @@ static void getvar_product(char *var_parameter, char *response);  static void getvar_platform(char *var_parameter, char *response);  static void getvar_current_slot(char *var_parameter, char *response);  static void getvar_slot_suffixes(char *var_parameter, char *response); +#if CONFIG_IS_ENABLED(FASTBOOT_FLASH)  static void getvar_has_slot(char *var_parameter, char *response); +#endif  #if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)  static void getvar_partition_type(char *part_name, char *response);  #endif @@ -65,9 +67,11 @@ static const struct {  	}, {  		.variable = "slot-suffixes",  		.dispatch = getvar_slot_suffixes +#if CONFIG_IS_ENABLED(FASTBOOT_FLASH)  	}, {  		.variable = "has-slot",  		.dispatch = getvar_has_slot +#endif  #if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)  	}, {  		.variable = "partition-type", @@ -81,6 +85,47 @@ static const struct {  	}  }; +#if CONFIG_IS_ENABLED(FASTBOOT_FLASH) +/** + * Get partition number and size for any storage type. + * + * Can be used to check if partition with specified name exists. + * + * If error occurs, this function guarantees to fill @p response with fail + * string. @p response can be rewritten in caller, if needed. + * + * @param[in] part_name Info for which partition name to look for + * @param[in,out] response Pointer to fastboot response buffer + * @param[out] size If not NULL, will contain partition size (in blocks) + * @return Partition number or negative value on error + */ +static int getvar_get_part_info(const char *part_name, char *response, +				size_t *size) +{ +	int r; +# if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) +	struct blk_desc *dev_desc; +	disk_partition_t part_info; + +	r = fastboot_mmc_get_part_info(part_name, &dev_desc, &part_info, +				       response); +	if (r >= 0 && size) +		*size = part_info.size; +# elif CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND) +	struct part_info *part_info; + +	r = fastboot_nand_get_part_info(part_name, &part_info, response); +	if (r >= 0 && size) +		*size = part_info->size; +# else +	fastboot_fail("this storage is not supported in bootloader", response); +	r = -ENODEV; +# endif + +	return r; +} +#endif +  static void getvar_version(char *var_parameter, char *response)  {  	fastboot_okay(FASTBOOT_VERSION, response); @@ -133,23 +178,48 @@ static void getvar_platform(char *var_parameter, char *response)  static void getvar_current_slot(char *var_parameter, char *response)  { -	/* A/B not implemented, for now always return _a */ -	fastboot_okay("_a", response); +	/* A/B not implemented, for now always return "a" */ +	fastboot_okay("a", response);  }  static void getvar_slot_suffixes(char *var_parameter, char *response)  { -	fastboot_okay("_a,_b", response); +	fastboot_okay("a,b", response);  } +#if CONFIG_IS_ENABLED(FASTBOOT_FLASH)  static void getvar_has_slot(char *part_name, char *response)  { -	if (part_name && (!strcmp(part_name, "boot") || -			  !strcmp(part_name, "system"))) -		fastboot_okay("yes", response); -	else -		fastboot_okay("no", response); +	char part_name_wslot[PART_NAME_LEN]; +	size_t len; +	int r; + +	if (!part_name || part_name[0] == '\0') +		goto fail; + +	/* part_name_wslot = part_name + "_a" */ +	len = strlcpy(part_name_wslot, part_name, PART_NAME_LEN - 3); +	if (len > PART_NAME_LEN - 3) +		goto fail; +	strcat(part_name_wslot, "_a"); + +	r = getvar_get_part_info(part_name_wslot, response, NULL); +	if (r >= 0) { +		fastboot_okay("yes", response); /* part exists and slotted */ +		return; +	} + +	r = getvar_get_part_info(part_name, response, NULL); +	if (r >= 0) +		fastboot_okay("no", response); /* part exists but not slotted */ + +	/* At this point response is filled with okay or fail string */ +	return; + +fail: +	fastboot_fail("invalid partition name", response);  } +#endif  #if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC)  static void getvar_partition_type(char *part_name, char *response) @@ -176,22 +246,7 @@ static void getvar_partition_size(char *part_name, char *response)  	int r;  	size_t size; -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_MMC) -	struct blk_desc *dev_desc; -	disk_partition_t part_info; - -	r = fastboot_mmc_get_part_info(part_name, &dev_desc, &part_info, -				       response); -	if (r >= 0) -		size = part_info.size; -#endif -#if CONFIG_IS_ENABLED(FASTBOOT_FLASH_NAND) -	struct part_info *part_info; - -	r = fastboot_nand_get_part_info(part_name, &part_info, response); -	if (r >= 0) -		size = part_info->size; -#endif +	r = getvar_get_part_info(part_name, response, &size);  	if (r >= 0)  		fastboot_response("OKAY", response, "0x%016zx", size);  } | 
