@@ -308,6 +308,28 @@ static int request_ish_firmware(const struct firmware **firmware_p,
308308 return _request_ish_firmware (firmware_p , filename , dev );
309309}
310310
311+ static int copy_manifest (const struct firmware * fw , struct ish_global_manifest * manifest )
312+ {
313+ u32 offset ;
314+
315+ for (offset = 0 ; offset + sizeof (* manifest ) < fw -> size ; offset += ISH_MANIFEST_ALIGNMENT ) {
316+ memcpy (manifest , fw -> data + offset , sizeof (* manifest ));
317+
318+ if (le32_to_cpu (manifest -> sig_fourcc ) == ISH_GLOBAL_SIG )
319+ return 0 ;
320+ }
321+
322+ return -1 ;
323+ }
324+
325+ static void copy_ish_version (struct version_in_manifest * src , struct ish_version * dst )
326+ {
327+ dst -> major = le16_to_cpu (src -> major );
328+ dst -> minor = le16_to_cpu (src -> minor );
329+ dst -> hotfix = le16_to_cpu (src -> hotfix );
330+ dst -> build = le16_to_cpu (src -> build );
331+ }
332+
311333/**
312334 * ishtp_loader_work() - Load the ISHTP firmware
313335 * @work: The work structure
@@ -336,6 +358,7 @@ void ishtp_loader_work(struct work_struct *work)
336358 struct loader_xfer_query query = { .header = cpu_to_le32 (query_hdr .val32 ), };
337359 struct loader_start start = { .header = cpu_to_le32 (start_hdr .val32 ), };
338360 union loader_recv_message recv_msg ;
361+ struct ish_global_manifest manifest ;
339362 const struct firmware * ish_fw ;
340363 void * dma_bufs [FRAGMENT_MAX_NUM ] = {};
341364 u32 fragment_size ;
@@ -372,7 +395,7 @@ void ishtp_loader_work(struct work_struct *work)
372395 if (rv )
373396 continue ; /* try again if failed */
374397
375- dev_dbg (dev -> devc , "ISH Version %u.%u.%u.%u\n" ,
398+ dev_dbg (dev -> devc , "ISH Bootloader Version %u.%u.%u.%u\n" ,
376399 recv_msg .query_ack .version_major ,
377400 recv_msg .query_ack .version_minor ,
378401 recv_msg .query_ack .version_hotfix ,
@@ -390,6 +413,16 @@ void ishtp_loader_work(struct work_struct *work)
390413 continue ; /* try again if failed */
391414
392415 dev_info (dev -> devc , "firmware loaded. size:%zu\n" , ish_fw -> size );
416+ if (!copy_manifest (ish_fw , & manifest )) {
417+ copy_ish_version (& manifest .base_ver , & dev -> base_ver );
418+ copy_ish_version (& manifest .prj_ver , & dev -> prj_ver );
419+ dev_info (dev -> devc , "FW base version: %u.%u.%u.%u\n" ,
420+ dev -> base_ver .major , dev -> base_ver .minor ,
421+ dev -> base_ver .hotfix , dev -> base_ver .build );
422+ dev_info (dev -> devc , "FW project version: %u.%u.%u.%u\n" ,
423+ dev -> prj_ver .major , dev -> prj_ver .minor ,
424+ dev -> prj_ver .hotfix , dev -> prj_ver .build );
425+ }
393426 break ;
394427 } while (-- retry );
395428
0 commit comments