[PATCH i-g-t v3 3/6] tools/intel-gfx-fw-info: Embed fw decoding
Gustavo Sousa
gustavo.sousa at intel.com
Mon Aug 26 17:59:40 UTC 2024
Quoting Lucas De Marchi (2024-08-26 12:26:53-03:00)
>Use a factory class method to decide what class to use depending on the
>magic and embed the calls to cstruct in each of them. Main motivation is
>that in future the decode method will need to seek the binary as it
>can't really know the version just checking the beginning of the file.
>
>For now, keep the open/close of the file in the main function, but
>eventually can be migrated as well.
>
>v2 (Gustavo):
>- Fix s/kw/**kw/
>- Remove unnecessary seek()
>- Use a constructor variable in create()
>- Squash call to sys.exit() that was in the wrong patch
>
>Acked-by: Kamil Konieczny <kamil.konieczny at linux.intel.com>
>Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
>---
> tools/intel-gfx-fw-info | 74 +++++++++++++++++++++++++++++------------
> 1 file changed, 52 insertions(+), 22 deletions(-)
>
>diff --git a/tools/intel-gfx-fw-info b/tools/intel-gfx-fw-info
>index 3105144b7..a4b9414f2 100755
>--- a/tools/intel-gfx-fw-info
>+++ b/tools/intel-gfx-fw-info
>@@ -105,8 +105,38 @@ def FIELD_GET(mask: int, value: int) -> int:
>
>
> class Fw(abc.ABC):
>- def __init__(self, fw):
>- self.fw = fw
>+ def __init__(self, cparser, f):
>+ self.f = f
>+ self.cparser = cparser
>+ self.fw = None
>+
>+ def checksum(self):
>+ self.f.seek(0, 0)
>+ return hashlib.sha256(self.f.read()).hexdigest()
>+
>+ def dump(self, **kw):
>+ cstruct.dumpstruct(self.fw, **kw)
>+
>+ @classmethod
>+ def create(cls, f):
>+ cparser = cstruct.cstruct()
>+ cparser.load(CDEF)
>+
>+ magic = cparser.magic(f).data
>+
>+ constructor = None
>+
>+ for s in cls.__subclasses__():
>+ if s.MAGIC is None:
>+ constructor = s
>+ elif s.MAGIC == magic:
>+ constructor = s
>+ break
>+
>+ if constructor:
>+ return constructor(cparser, f)
>+
>+ return None
>
> @abc.abstractmethod
> def decode(self):
>@@ -114,8 +144,13 @@ class Fw(abc.ABC):
>
>
> class FwCss(Fw):
>+ MAGIC = None
>+
> def decode(self):
>- data = []
>+ self.f.seek(0, 0)
>+ self.fw = self.cparser.uc_css_header(self.f)
>+
>+ data = ["header-type: CSS"]
>
> CSS_SW_VERSION_UC_MAJOR = 0xFF << 16
> CSS_SW_VERSION_UC_MINOR = 0xFF << 8
>@@ -137,8 +172,13 @@ class FwCss(Fw):
>
>
> class FwGsc(Fw):
>+ MAGIC = b"$CPD"
>+
> def decode(self):
>- data = []
>+ self.f.seek(0, 0)
>+ self.fw = self.cparser.uc_huc_gsc_header(self.f)
>+
>+ data = ["header-type: GSC"]
>
> HUC_GSC_MINOR_VER_HI_MASK = 0xFF << 16
> HUC_GSC_MAJOR_VER_HI_MASK = 0xFF
>@@ -167,40 +207,30 @@ def parse_args(argv: typing.List[str]) -> argparse.Namespace:
> 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)
>- f.seek(0, 0)
>- if magic.data == b"$CPD":
>- fw = FwGsc(cparser.uc_huc_gsc_header(f))
>- else:
>- fw = FwCss(cparser.uc_css_header(f))
>+ fw = Fw.create(f)
>+ if not fw:
>+ logging.fatal("Unknown firmware type in '{args.filename}'")
Sorry I didn't spot this earlier: we are missing the f prefix here.
With that,
Reviewed-by: Gustavo Sousa <gustavo.sousa at intel.com>
>+ sys.exit(1)
>
>+ decoded_data = fw.decode()
> if args.checksum:
>- f.seek(0, 0)
>- checksum = calculate_checksum(f)
>-
>+ checksum = fw.checksum()
> except FileNotFoundError as e:
> logging.fatal(e)
> return 1
>
>- print(*fw.decode(), sep="\n")
>+ print(*decoded_data, sep="\n")
>
> if args.raw:
> print("raw dump:", end="")
>- cstruct.dumpstruct(fw.fw, color=sys.stdout.isatty())
>+ fw.dump(color=sys.stdout.isatty())
>
> if checksum:
> print(f"checksum: {checksum}")
>--
>2.43.0
>
More information about the igt-dev
mailing list