Commit e6e84e96 authored by Ben Gardiner's avatar Ben Gardiner Committed by Chris Ball
Browse files

extract PARTITION_SETTING_COMPLETE function



Extract a function which sets the OTP PARTITION_SETTING_COMPLETE
bit; once this bit is set there are many other parameters in
EXT_CSD which can no longer be set.

Multiple OTP partition settings can be achieved by calling 'set'
commands with '-n' on all except for the last.
Signed-off-by: default avatarBen Gardiner <ben.l.gardiner@gmail.com>
Signed-off-by: default avatarChris Ball <cjb@laptop.org>
parent d91d3698
...@@ -449,6 +449,51 @@ unsigned int get_hc_erase_grp_size(__u8 *ext_csd) ...@@ -449,6 +449,51 @@ unsigned int get_hc_erase_grp_size(__u8 *ext_csd)
return ext_csd[224]; return ext_csd[224];
} }
int set_partitioning_setting_completed(int dry_run, const char * const device,
int fd)
{
int ret;
if (dry_run) {
fprintf(stderr, "NOT setting PARTITION_SETTING_COMPLETED\n");
fprintf(stderr, "These changes will not take effect neither "
"now nor after a power cycle\n");
return 1;
}
fprintf(stderr, "setting OTP PARTITION_SETTING_COMPLETED!\n");
ret = write_extcsd_value(fd, EXT_CSD_PARTITION_SETTING_COMPLETED, 0x1);
if (ret) {
fprintf(stderr, "Could not write 0x1 to "
"EXT_CSD[%d] in %s\n",
EXT_CSD_PARTITION_SETTING_COMPLETED, device);
return 1;
}
__u32 response;
ret = send_status(fd, &response);
if (ret) {
fprintf(stderr, "Could not get response to SEND_STATUS "
"from %s\n", device);
return 1;
}
if (response & R1_SWITCH_ERROR) {
fprintf(stderr, "Setting OTP PARTITION_SETTING_COMPLETED "
"failed on %s\n", device);
return 1;
}
fprintf(stderr, "Setting OTP PARTITION_SETTING_COMPLETED on "
"%s SUCCESS\n", device);
fprintf(stderr, "Device power cycle needed for settings to "
"take effect.\n"
"Confirm that PARTITION_SETTING_COMPLETED bit is set "
"using 'extcsd read' after power cycle\n");
return 0;
}
int do_enh_area_set(int nargs, char **argv) int do_enh_area_set(int nargs, char **argv)
{ {
__u8 value; __u8 value;
...@@ -579,38 +624,10 @@ int do_enh_area_set(int nargs, char **argv) ...@@ -579,38 +624,10 @@ int do_enh_area_set(int nargs, char **argv)
exit(1); exit(1);
} }
if (dry_run) printf("Done setting ENH_USR area on %s\n", device);
{
fprintf(stderr, "NOT setting PARTITION_SETTING_COMPLETED\n");
exit(1);
}
fprintf(stderr, "setting OTP PARTITION_SETTING_COMPLETED!\n"); if (!set_partitioning_setting_completed(dry_run, device, fd))
ret = write_extcsd_value(fd, EXT_CSD_PARTITION_SETTING_COMPLETED, 0x1);
if (ret) {
fprintf(stderr, "Could not write 0x1 to "
"EXT_CSD[%d] in %s\n",
EXT_CSD_PARTITION_SETTING_COMPLETED, device);
exit(1); exit(1);
}
__u32 response;
ret = send_status(fd, &response);
if (ret) {
fprintf(stderr, "Could not get response to SEND_STATUS from %s\n", device);
exit(1);
}
if (response & R1_SWITCH_ERROR)
{
fprintf(stderr, "Setting ENH_USR area failed on %s\n", device);
exit(1);
}
fprintf(stderr, "Setting ENH_USR area on %s SUCCESS\n", device);
fprintf(stderr, "Device power cycle needed for settings to take effect.\n"
"Confirm that PARTITION_SETTING_COMPLETED bit is set using 'extcsd read'"
"after power cycle\n");
return 0; return 0;
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment