mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-05 01:54:09 +08:00
Input: synaptics-rmi4 - rewrite partition table unconditionally
Preparation for use of the "erase application" command, which is required to recover from a bad partition table error condition. Rather than adding complex fallback error paths for such errors, it seems more robust to do the full erase unconditionally. Signed-off-by: Matthias Schiffer <matthias.schiffer@ew.tq-group.com> Reviewed-by: Lyude Paul <lyude@redhat.com> Link: https://lore.kernel.org/r/20220608124808.51402-5-matthias.schiffer@ew.tq-group.com Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
This commit is contained in:
parent
b4d6c6a07f
commit
0113b49bd9
@ -262,7 +262,6 @@ struct f34v5_data {
|
||||
struct f34v7_data {
|
||||
bool has_display_cfg;
|
||||
bool has_guest_code;
|
||||
bool force_update;
|
||||
bool in_bl_mode;
|
||||
u8 *read_config_buf;
|
||||
size_t read_config_buf_size;
|
||||
@ -276,7 +275,6 @@ struct f34v7_data {
|
||||
u16 payload_length;
|
||||
u8 partitions;
|
||||
u16 partition_table_bytes;
|
||||
bool new_partition_table;
|
||||
|
||||
struct register_offset off;
|
||||
struct block_count blkcount;
|
||||
|
@ -593,68 +593,6 @@ static int rmi_f34v7_read_queries(struct f34_data *f34)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rmi_f34v7_check_ui_firmware_size(struct f34_data *f34)
|
||||
{
|
||||
u16 block_count;
|
||||
|
||||
block_count = f34->v7.img.ui_firmware.size / f34->v7.block_size;
|
||||
f34->update_size += block_count;
|
||||
|
||||
if (block_count != f34->v7.blkcount.ui_firmware) {
|
||||
dev_err(&f34->fn->dev,
|
||||
"UI firmware size mismatch: %d != %d\n",
|
||||
block_count, f34->v7.blkcount.ui_firmware);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rmi_f34v7_check_ui_config_size(struct f34_data *f34)
|
||||
{
|
||||
u16 block_count;
|
||||
|
||||
block_count = f34->v7.img.ui_config.size / f34->v7.block_size;
|
||||
f34->update_size += block_count;
|
||||
|
||||
if (block_count != f34->v7.blkcount.ui_config) {
|
||||
dev_err(&f34->fn->dev, "UI config size mismatch\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rmi_f34v7_check_dp_config_size(struct f34_data *f34)
|
||||
{
|
||||
u16 block_count;
|
||||
|
||||
block_count = f34->v7.img.dp_config.size / f34->v7.block_size;
|
||||
f34->update_size += block_count;
|
||||
|
||||
if (block_count != f34->v7.blkcount.dp_config) {
|
||||
dev_err(&f34->fn->dev, "Display config size mismatch\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rmi_f34v7_check_guest_code_size(struct f34_data *f34)
|
||||
{
|
||||
u16 block_count;
|
||||
|
||||
block_count = f34->v7.img.guest_code.size / f34->v7.block_size;
|
||||
f34->update_size += block_count;
|
||||
|
||||
if (block_count != f34->v7.blkcount.guest_code) {
|
||||
dev_err(&f34->fn->dev, "Guest code size mismatch\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rmi_f34v7_check_bl_config_size(struct f34_data *f34)
|
||||
{
|
||||
u16 block_count;
|
||||
@ -750,7 +688,7 @@ static int rmi_f34v7_erase_all(struct f34_data *f34)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (f34->v7.new_partition_table && f34->v7.has_guest_code) {
|
||||
if (f34->v7.has_guest_code) {
|
||||
ret = rmi_f34v7_erase_guest_code(f34);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@ -1029,33 +967,6 @@ static int rmi_f34v7_write_firmware(struct f34_data *f34)
|
||||
blk_count, v7_CMD_WRITE_FW);
|
||||
}
|
||||
|
||||
static void rmi_f34v7_compare_partition_tables(struct f34_data *f34)
|
||||
{
|
||||
if (f34->v7.phyaddr.ui_firmware != f34->v7.img.phyaddr.ui_firmware) {
|
||||
f34->v7.new_partition_table = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (f34->v7.phyaddr.ui_config != f34->v7.img.phyaddr.ui_config) {
|
||||
f34->v7.new_partition_table = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (f34->v7.has_display_cfg &&
|
||||
f34->v7.phyaddr.dp_config != f34->v7.img.phyaddr.dp_config) {
|
||||
f34->v7.new_partition_table = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (f34->v7.has_guest_code &&
|
||||
f34->v7.phyaddr.guest_code != f34->v7.img.phyaddr.guest_code) {
|
||||
f34->v7.new_partition_table = true;
|
||||
return;
|
||||
}
|
||||
|
||||
f34->v7.new_partition_table = false;
|
||||
}
|
||||
|
||||
static void rmi_f34v7_parse_img_header_10_bl_container(struct f34_data *f34,
|
||||
const void *image)
|
||||
{
|
||||
@ -1202,8 +1113,6 @@ static int rmi_f34v7_parse_image_info(struct f34_data *f34)
|
||||
rmi_f34v7_parse_partition_table(f34, f34->v7.img.fl_config.data,
|
||||
&f34->v7.img.blkcount, &f34->v7.img.phyaddr);
|
||||
|
||||
rmi_f34v7_compare_partition_tables(f34);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1224,44 +1133,18 @@ int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw)
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
if (!f34->v7.new_partition_table) {
|
||||
ret = rmi_f34v7_check_ui_firmware_size(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
ret = rmi_f34v7_check_ui_config_size(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
if (f34->v7.has_display_cfg &&
|
||||
f34->v7.img.contains_display_cfg) {
|
||||
ret = rmi_f34v7_check_dp_config_size(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) {
|
||||
ret = rmi_f34v7_check_guest_code_size(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
} else {
|
||||
ret = rmi_f34v7_check_bl_config_size(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
ret = rmi_f34v7_check_bl_config_size(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
ret = rmi_f34v7_erase_all(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
if (f34->v7.new_partition_table) {
|
||||
ret = rmi_f34v7_write_partition_table(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
dev_info(&f34->fn->dev, "%s: Partition table programmed\n",
|
||||
__func__);
|
||||
}
|
||||
ret = rmi_f34v7_write_partition_table(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
dev_info(&f34->fn->dev, "%s: Partition table programmed\n", __func__);
|
||||
|
||||
dev_info(&f34->fn->dev, "Writing firmware (%d bytes)...\n",
|
||||
f34->v7.img.ui_firmware.size);
|
||||
@ -1286,14 +1169,12 @@ int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (f34->v7.new_partition_table) {
|
||||
if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) {
|
||||
dev_info(&f34->fn->dev, "Writing guest code...\n");
|
||||
if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) {
|
||||
dev_info(&f34->fn->dev, "Writing guest code...\n");
|
||||
|
||||
ret = rmi_f34v7_write_guest_code(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
ret = rmi_f34v7_write_guest_code(f34);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fail:
|
||||
@ -1339,13 +1220,6 @@ int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw)
|
||||
if (ret < 0)
|
||||
goto exit;
|
||||
|
||||
if (!f34->v7.force_update && f34->v7.new_partition_table) {
|
||||
dev_err(&f34->fn->dev, "%s: Partition table mismatch\n",
|
||||
__func__);
|
||||
ret = -EINVAL;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
dev_info(&f34->fn->dev, "Firmware image OK\n");
|
||||
|
||||
ret = rmi_f34v7_read_flash_status(f34);
|
||||
@ -1406,6 +1280,5 @@ int rmi_f34v7_probe(struct f34_data *f34)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
f34->v7.force_update = true;
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user