[RESEND, RFC 2/8] binman: etype: sysfw: Add entry type for sysfw

Neha Malcom Francis n-francis at ti.com
Wed Apr 6 14:29:13 CEST 2022


For K3 devices that require a sysfw image, add entry for SYSFW. It can
contain system firmware image that can be packaged into sysfw.itb by
binman. The method ReadBlobContents in sysfw.py runs the TI K3
certificate generation script to create the signed sysfw image that can
be used for packaging by binman into sysfw.bin.

Signed-off-by: Tarun Sahu <t-sahu at ti.com>
[n-francis at ti.com: added tests for addition of etype]
Signed-off-by: Neha Malcom Francis <n-francis at ti.com>
---
 tools/binman/entries.rst        | 11 ++++++
 tools/binman/etype/sysfw.py     | 60 +++++++++++++++++++++++++++++++++
 tools/binman/ftest.py           |  7 ++++
 tools/binman/test/226_sysfw.dts | 13 +++++++
 4 files changed, 91 insertions(+)
 create mode 100644 tools/binman/etype/sysfw.py
 create mode 100644 tools/binman/test/226_sysfw.dts

diff --git a/tools/binman/entries.rst b/tools/binman/entries.rst
index 484cde5c80..7c95bbfbec 100644
--- a/tools/binman/entries.rst
+++ b/tools/binman/entries.rst
@@ -1019,6 +1019,17 @@ This entry holds firmware for an external platform-specific coprocessor.
 
 
 
+Entry: sysfw: Texas Instruments System Firmware (SYSFW) blob
+------------------------------------------------------------
+
+Properties / Entry arguments:
+    - sysfw-path: Filename of file to read into the entry, typically sysfw.bin
+
+This entry contains system firmware necessary for booting of K3 architecture
+devices.
+
+
+
 Entry: section: Entry that contains other entries
 -------------------------------------------------
 
diff --git a/tools/binman/etype/sysfw.py b/tools/binman/etype/sysfw.py
new file mode 100644
index 0000000000..c73300400b
--- /dev/null
+++ b/tools/binman/etype/sysfw.py
@@ -0,0 +1,60 @@
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (C) 2022 Texas Instruments Incorporated - https://www.ti.com/
+#
+# Entry type module for TI SYSFW binary blob
+#
+
+import struct
+import zlib
+import os
+import sys
+
+from binman.etype.blob_named_by_arg import Entry_blob_named_by_arg
+from dtoc import fdt_util
+from patman import tools
+
+
+class Entry_sysfw(Entry_blob_named_by_arg):
+    """Entry containing System Firmware (SYSFW) blob
+
+    Properties / Entry arguments:
+        - sysfw-path: Filename of file to read into the entry, typically sysfw.bin
+
+This entry contains system firmware necessary for booting of K3 architecture devices.
+    """
+
+    def __init__(self, section, etype, node):
+        super().__init__(section, etype, node, 'scp')
+        self.core = "0"
+        self.missing_msg = "sysfw"
+
+    def ReadNode(self):
+        self._load_addr = fdt_util.GetInt(self._node, 'load', 0)
+        self._args = []
+
+    def _SignSysfw(self, out):
+        """Sign the sysfw image and write it to the output directory"""
+        # Try running the K3 x509 certificate signing script
+        try:
+            args = [
+                '-c', "0",
+                '-b', self._filename,
+                '-l', str(self._load_addr),
+                '-o', out
+            ]
+            k3_cert_gen_path = os.environ['srctree'] + \
+                "/tools/k3_gen_x509_cert.sh"
+            tools.run(k3_cert_gen_path, *args)
+            self.SetContents(tools.read_file(out))
+            return True
+        # If not available (example, in the case of binman tests, set entry contents as dummy binary)
+        except KeyError:
+            self.missing = True
+            self.SetContents(b'sysfw')
+            return True
+
+    def ObtainContents(self):
+        self.missing = False
+        out = tools.get_output_filename("sysfwint")
+        self._SignSysfw(out)
+        return True
diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py
index 8f00db6945..7c12058fe4 100644
--- a/tools/binman/ftest.py
+++ b/tools/binman/ftest.py
@@ -87,6 +87,7 @@ ATF_BL31_DATA         = b'bl31'
 TEE_OS_DATA           = b'this is some tee OS data'
 ATF_BL2U_DATA         = b'bl2u'
 OPENSBI_DATA          = b'opensbi'
+SYSFW_DATA            = b'sysfw'
 SCP_DATA              = b'scp'
 TEST_FDT1_DATA        = b'fdt1'
 TEST_FDT2_DATA        = b'test-fdt2'
@@ -192,6 +193,7 @@ class TestFunctional(unittest.TestCase):
         TestFunctional._MakeInputFile('tee-pager.bin', TEE_OS_DATA)
         TestFunctional._MakeInputFile('bl2u.bin', ATF_BL2U_DATA)
         TestFunctional._MakeInputFile('fw_dynamic.bin', OPENSBI_DATA)
+        TestFunctional._MakeInputFile('sysfw.bin', SYSFW_DATA)
         TestFunctional._MakeInputFile('scp.bin', SCP_DATA)
 
         # Add a few .dtb files for testing
@@ -5321,6 +5323,11 @@ fdt         fdtmap                Extract the devicetree blob from the fdtmap
         self.assertIn("Node '/binman/fit': Unknown operation 'unknown'",
                       str(exc.exception))
 
+    def testPackSysfw(self):
+        """Test that an image with a SYSFW binary can be created"""
+        data = self._DoReadFile('226_sysfw.dts')
+        self.assertEqual(SYSFW_DATA, data[:len(SYSFW_DATA)])
+
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tools/binman/test/226_sysfw.dts b/tools/binman/test/226_sysfw.dts
new file mode 100644
index 0000000000..23d64d3688
--- /dev/null
+++ b/tools/binman/test/226_sysfw.dts
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+/dts-v1/;
+
+/ {
+	#address-cells = <1>;
+	#size-cells = <1>;
+	binman {
+		sysfw {
+			filename = "sysfw.bin";
+		};
+	};
+};
-- 
2.17.1



More information about the U-Boot mailing list