ccgx: Do not store the silicon ID in the image address

First, it's a hack; second we actually need to store the start address for
flashing FW2 on asymmetric hardware...
This commit is contained in:
Richard Hughes 2020-03-24 20:49:51 +00:00
parent bf5481e358
commit 87d39d06a3
3 changed files with 19 additions and 6 deletions

View File

@ -21,6 +21,7 @@ struct _FuCcgxCyacdFirmwareImage {
FuFirmwareImageClass parent_instance;
GPtrArray *records;
guint16 app_type;
guint16 silicon_id;
};
G_DEFINE_TYPE (FuCcgxCyacdFirmwareImage, fu_ccgx_cyacd_firmware_image, FU_TYPE_FIRMWARE_IMAGE)
@ -39,6 +40,13 @@ fu_ccgx_cyacd_firmware_image_get_app_type (FuCcgxCyacdFirmwareImage *self)
return self->app_type;
}
guint16
fu_ccgx_cyacd_firmware_image_get_silicon_id (FuCcgxCyacdFirmwareImage *self)
{
g_return_val_if_fail (FU_IS_CCGX_CYACD_FIRMWARE_IMAGE (self), 0);
return self->silicon_id;
}
static void
fu_ccgx_cyacd_firmware_image_record_free (FuCcgxCyacdFirmwareImageRecord *rcd)
{
@ -158,8 +166,7 @@ fu_ccgx_cyacd_firmware_image_parse_header (FuCcgxCyacdFirmwareImage *self,
"invalid header, expected == 12 chars");
return FALSE;
}
fu_firmware_image_set_addr (FU_FIRMWARE_IMAGE (self),
fu_firmware_strparse_uint32 (line));
self->silicon_id = fu_firmware_strparse_uint32 (line) >> 16;
return TRUE;
}
@ -221,6 +228,10 @@ fu_ccgx_cyacd_firmware_image_add_record (FuCcgxCyacdFirmwareImage *self,
return FALSE;
}
/* first data entry */
if (self->records->len == 0)
fu_firmware_image_set_addr (FU_FIRMWARE_IMAGE (self), rcd->row_number);
/* success */
g_ptr_array_add (self->records, g_steal_pointer (&rcd));
return TRUE;

View File

@ -29,3 +29,4 @@ gboolean fu_ccgx_cyacd_firmware_image_add_record (FuCcgxCyacdFirmwareImage *sel
GError **error);
GPtrArray *fu_ccgx_cyacd_firmware_image_get_records (FuCcgxCyacdFirmwareImage *self);
guint16 fu_ccgx_cyacd_firmware_image_get_app_type (FuCcgxCyacdFirmwareImage *self);
guint16 fu_ccgx_cyacd_firmware_image_get_silicon_id (FuCcgxCyacdFirmwareImage *self);

View File

@ -573,15 +573,16 @@ fu_ccgx_hpi_device_prepare_firmware (FuDevice *device,
images = fu_firmware_get_images (firmware);
for (guint i = 0; i < images->len; i++) {
FuFirmwareImage *img = g_ptr_array_index (images, i);
guint16 fw_app_type = fu_ccgx_cyacd_firmware_image_get_app_type (FU_CCGX_CYACD_FIRMWARE_IMAGE (img));
if (fu_firmware_image_get_addr (img) != self->silicon_id) {
FuCcgxCyacdFirmwareImage *img_ccgx = FU_CCGX_CYACD_FIRMWARE_IMAGE (img);
guint16 fw_app_type = fu_ccgx_cyacd_firmware_image_get_app_type (img_ccgx);
guint16 fw_silicon_id = fu_ccgx_cyacd_firmware_image_get_silicon_id (img_ccgx);
if (fw_silicon_id != self->silicon_id) {
g_set_error (error,
FWUPD_ERROR,
FWUPD_ERROR_NOT_SUPPORTED,
"silicon id mismatch on image %u, "
"expected 0x%x, got 0x%x",
i, self->silicon_id,
(guint) fu_firmware_image_get_addr (img));
i, self->silicon_id, fw_silicon_id);
return NULL;
}
if (fw_app_type != self->fw_app_type) {