arch-arm, configs: Create single instance of DTB autogeneration

This patch is rewriting the DTB autogeneration functions available in
fs_bigLITTLE.py and fs.py as a single method in the GenericArmSystem
so that other configuration scripts can make use of it.

Change-Id: I492bbf77e6b0ac5c5fbdbc75c0eecba29bd63bda
Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/c/15958
Reviewed-by: Ciro Santilli <ciro.santilli@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
diff --git a/configs/example/arm/fs_bigLITTLE.py b/configs/example/arm/fs_bigLITTLE.py
index 8cf89e3..f363872 100644
--- a/configs/example/arm/fs_bigLITTLE.py
+++ b/configs/example/arm/fs_bigLITTLE.py
@@ -261,16 +261,7 @@
     if options.dtb is not None:
         system.dtb_filename = SysPaths.binary(options.dtb)
     else:
-        def create_dtb_for_system(system, filename):
-            state = FdtState(addr_cells=2, size_cells=2, cpu_cells=1)
-            rootNode = system.generateDeviceTree(state)
-
-            fdt = Fdt()
-            fdt.add_rootnode(rootNode)
-            dtb_filename = os.path.join(m5.options.outdir, filename)
-            return fdt.writeDtbFile(dtb_filename)
-
-        system.dtb_filename = create_dtb_for_system(system, 'system.dtb')
+        system.generateDtb(m5.options.outdir, 'system.dtb')
 
     return root
 
diff --git a/configs/example/fs.py b/configs/example/fs.py
index 4d21658..05eca87 100644
--- a/configs/example/fs.py
+++ b/configs/example/fs.py
@@ -360,19 +360,10 @@
              "with generation functionality.")
 
     # Generate a Device Tree
-    def create_dtb_for_system(system, filename):
-        state = FdtState(addr_cells=2, size_cells=2, cpu_cells=1)
-        rootNode = system.generateDeviceTree(state)
-
-        fdt = Fdt()
-        fdt.add_rootnode(rootNode)
-        dtb_filename = os.path.join(m5.options.outdir, filename)
-        return fdt.writeDtbFile(dtb_filename)
-
     for sysname in ('system', 'testsys', 'drivesys'):
         if hasattr(root, sysname):
             sys = getattr(root, sysname)
-            sys.dtb_filename = create_dtb_for_system(sys, '%s.dtb' % sysname)
+            sys.generateDtb(m5.options.outdir, '%s.dtb' % sysname)
 
 Simulation.setWorkCountOptions(test_sys, options)
 Simulation.run(options, root, test_sys, FutureClass)
diff --git a/src/arch/arm/ArmSystem.py b/src/arch/arm/ArmSystem.py
index bee38a4..98ff959 100644
--- a/src/arch/arm/ArmSystem.py
+++ b/src/arch/arm/ArmSystem.py
@@ -37,6 +37,7 @@
 #          Glenn Bergmans
 
 from m5.params import *
+from m5.options import *
 from m5.SimObject import *
 from m5.util.fdthelper import *
 
@@ -138,6 +139,19 @@
     panic_on_oops = Param.Bool(False, "Trigger a gem5 panic if the " \
                                    "guest kernel oopses")
 
+    def generateDtb(self, outdir, filename):
+        """
+        Autogenerate DTB. Arguments are the folder where the DTB
+        will be stored, and the name of the DTB file.
+        """
+        state = FdtState(addr_cells=2, size_cells=2, cpu_cells=1)
+        rootNode = self.generateDeviceTree(state)
+
+        fdt = Fdt()
+        fdt.add_rootnode(rootNode)
+        dtb_filename = os.path.join(outdir, filename)
+        self.dtb_filename = fdt.writeDtbFile(dtb_filename)
+
 class LinuxArmSystem(GenericArmSystem):
     type = 'LinuxArmSystem'
     cxx_header = "arch/arm/linux/system.hh"