From 5c044ff52362f379b5a9296e724df9546ae98b34 Mon Sep 17 00:00:00 2001
From: Simon Glass <sjg@chromium.org>
Date: Tue, 8 Feb 2022 11:49:58 -0700
Subject: [PATCH] binman: Support a list of strings with the mkimage etype

At present the 'args' property of the mkimage entry type is a string. This
makes it difficult to include CONFIG options in that property. In
particular, this does not work:

   args = "-n CONFIG_SYS_SOC -E"

since the preprocessor does not operate within strings, nor does this:

   args = "-n" CONFIG_SYS_SOC" "-E"

since the device tree compiler does not understand string concatenation.

With this new feature, we can do:

   args = "-n", CONFIG_SYS_SOC, "-E";

Signed-off-by: Simon Glass <sjg@chromium.org>
---
 tools/binman/elf_test.py      |  6 +++---
 tools/binman/entries.rst      | 11 +++++++++++
 tools/binman/etype/mkimage.py | 13 ++++++++++++-
 3 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/tools/binman/elf_test.py b/tools/binman/elf_test.py
index f92352d54f..a67915bda6 100644
--- a/tools/binman/elf_test.py
+++ b/tools/binman/elf_test.py
@@ -263,7 +263,7 @@ class TestElf(unittest.TestCase):
         if not elf.ELF_TOOLS:
             self.skipTest('Python elftools not available')
         fname = self.ElfTestFile('embed_data')
-        segments, entry = elf.read_segments(tools.ReadFile(fname))
+        segments, entry = elf.read_segments(tools.read_file(fname))
 
     def test_read_segments_fail(self):
         """Test for read_segments() without elftools"""
@@ -272,7 +272,7 @@ class TestElf(unittest.TestCase):
             elf.ELF_TOOLS = False
             fname = self.ElfTestFile('embed_data')
             with self.assertRaises(ValueError) as e:
-                elf.read_segments(tools.ReadFile(fname))
+                elf.read_segments(tools.read_file(fname))
             self.assertIn('Python elftools package is not available',
                           str(e.exception))
         finally:
@@ -282,7 +282,7 @@ class TestElf(unittest.TestCase):
         """Test for read_segments() with an invalid ELF file"""
         fname = self.ElfTestFile('embed_data')
         with self.assertRaises(ValueError) as e:
-            elf.read_segments(tools.GetBytes(100, 100))
+            elf.read_segments(tools.get_bytes(100, 100))
         self.assertIn('Magic number does not match', str(e.exception))
 
 
diff --git a/tools/binman/entries.rst b/tools/binman/entries.rst
index 88230a69d4..c4aa5fffe8 100644
--- a/tools/binman/entries.rst
+++ b/tools/binman/entries.rst
@@ -931,6 +931,17 @@ This calls mkimage to create an imximage with u-boot-spl.bin as the input
 file. The output from mkimage then becomes part of the image produced by
 binman.
 
+To use CONFIG options in the arguments, use a string list instead, as in
+this example which also produces four arguments::
+
+    mkimage {
+        args = "-n", CONFIG_SYS_SOC, "-T imximage";
+
+        u-boot-spl {
+        };
+    };
+
+
 
 
 Entry: opensbi: RISC-V OpenSBI fw_dynamic blob
diff --git a/tools/binman/etype/mkimage.py b/tools/binman/etype/mkimage.py
index baa16f36f3..ba4fb25de8 100644
--- a/tools/binman/etype/mkimage.py
+++ b/tools/binman/etype/mkimage.py
@@ -31,10 +31,21 @@ class Entry_mkimage(Entry):
     This calls mkimage to create an imximage with u-boot-spl.bin as the input
     file. The output from mkimage then becomes part of the image produced by
     binman.
+
+    To use CONFIG options in the arguments, use a string list instead, as in
+    this example which also produces four arguments::
+
+        mkimage {
+            args = "-n", CONFIG_SYS_SOC, "-T imximage";
+
+            u-boot-spl {
+            };
+        };
+
     """
     def __init__(self, section, etype, node):
         super().__init__(section, etype, node)
-        self._args = fdt_util.GetString(self._node, 'args').split(' ')
+        self._args = fdt_util.GetArgs(self._node, 'args')
         self._mkimage_entries = OrderedDict()
         self.align_default = None
         self.ReadEntries()
-- 
2.39.5