[PATCH i-g-t 2/2] intel-gfx-fw-info: Allow to print checksum

Lucas De Marchi lucas.demarchi at intel.com
Tue Aug 13 15:21:41 UTC 2024


Choose a checksum algo and use it to print when parsing a firmware.
This may be useful in CI to dump what is the exact firmware used
and may also be useful when inspecting the firmware repo and making
sure mistakes are not introduced. Configuring intel-gfx-fw-info a diff
driver:

	firmware $ echo "*.bin   diff=intelfw" >> .git/info/attributes
	firmware $ git config --local \
		diff.intelfw.textconv \
		"<path-to-igt>/tools/intel-gfx-fw-info -c"

Example for the LNL update that happened recently:

	firmware $ git diff --text bc42cdc34bd8 b5bef5bdbab1 --  xe/lnl_guc_70.bin
	diff --git a/xe/lnl_guc_70.bin b/xe/lnl_guc_70.bin
	index 785763163..75a1958f7 100644
	--- a/xe/lnl_guc_70.bin
	+++ b/xe/lnl_guc_70.bin
	@@ -1,3 +1,3 @@
	-version: 70.20.0
	-date: 2024-02-09
	-checksum: 0809f459048a23716fd3019074f36812163e027835cbb43acfcfe72cd83fb0cc
	+version: 70.29.2
	+date: 2024-07-26
	+checksum: e7ceae28b06bd71c53fe177f4f6787aac88956d8944fa02b1ab2ec53b1e961e4

If for some reason there's only a checksum change, something went wrong,
and without it we wouldn't notice when using this tool as a diff driver.

Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
---
 tools/intel-gfx-fw-info | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/tools/intel-gfx-fw-info b/tools/intel-gfx-fw-info
index c0d9b00ac..31dc78776 100755
--- a/tools/intel-gfx-fw-info
+++ b/tools/intel-gfx-fw-info
@@ -6,6 +6,7 @@
 
 import argparse
 import logging
+import hashlib
 import sys
 import typing
 
@@ -151,18 +152,26 @@ def parse_args(argv: typing.List[str]) -> argparse.Namespace:
 
     parser.add_argument("-x", "--raw", action="store_true",
                         help="Also print raw header content")
+    parser.add_argument("-c", "--checksum", action="store_true",
+                        help="Also print checksum")
 
     parser.add_argument("filename", help="GuC/HuC firmware file")
 
     return parser.parse_args(argv)
 
 
+def calculate_checksum(f: typing.BinaryIO) -> str:
+    return hashlib.sha256(f.read()).hexdigest()
+
+
 def main(argv: typing.List[str]) -> int:
     args = parse_args(argv)
 
     cparser = cstruct.cstruct()
     cparser.load(CDEF)
 
+    checksum = None
+
     try:
         with open(args.filename, mode="rb") as f:
             magic = cparser.magic(f)
@@ -171,6 +180,11 @@ def main(argv: typing.List[str]) -> int:
                 fw = FwGsc(cparser.uc_huc_gsc_header(f))
             else:
                 fw = FwCss(cparser.uc_css_header(f))
+
+            if args.checksum:
+                f.seek(0, 0)
+                checksum = calculate_checksum(f)
+
     except FileNotFoundError as e:
         logging.fatal(e)
         return 1
@@ -181,6 +195,9 @@ def main(argv: typing.List[str]) -> int:
         print("raw dump:", end="")
         cstruct.dumpstruct(fw.fw, color=sys.stdout.isatty())
 
+    if checksum:
+        print(f"checksum: {checksum}")
+
     return 0
 
 
-- 
2.43.0



More information about the igt-dev mailing list