config: Embed Device Tree generation in fs.py config
Equips the fs.py config routine with an extra commandline option --generate-dtb that will generate a dtb file automatically before running the simulation. Only works with ARM systems and gives a warning if the simulated system is not of --machine-type VExpress_GEM5_V1. Change-Id: I7766e5459fd9bec2245de83cef103091ebaf7229 Reviewed-by: Curtis Dunham <curtis.dunham@arm.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/5968 Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
This commit is contained in:
committed by
Curtis Dunham
parent
7c9122b6f2
commit
dcab5b577e
@@ -204,7 +204,8 @@ def makeSparcSystem(mem_mode, mdesc=None, cmdline=None):
|
||||
|
||||
def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None,
|
||||
dtb_filename=None, bare_metal=False, cmdline=None,
|
||||
external_memory="", ruby=False, security=False):
|
||||
external_memory="", ruby=False, security=False,
|
||||
ignore_dtb=False):
|
||||
assert machine_type
|
||||
|
||||
default_dtbs = {
|
||||
@@ -249,7 +250,7 @@ def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None,
|
||||
machine_type = platform_class.__name__
|
||||
self.realview = platform_class()
|
||||
|
||||
if not dtb_filename and not bare_metal:
|
||||
if not dtb_filename and not (bare_metal or ignore_dtb):
|
||||
try:
|
||||
dtb_filename = default_dtbs[machine_type]
|
||||
except KeyError:
|
||||
@@ -305,7 +306,7 @@ def makeArmSystem(mem_mode, machine_type, num_cpus=1, mdesc=None,
|
||||
if machine_type in default_kernels:
|
||||
self.kernel = binary(default_kernels[machine_type])
|
||||
|
||||
if dtb_filename:
|
||||
if dtb_filename and not ignore_dtb:
|
||||
self.dtb_filename = binary(dtb_filename)
|
||||
|
||||
self.machine_type = machine_type if machine_type in ArmMachineType.map \
|
||||
|
||||
@@ -343,6 +343,8 @@ def addFSOptions(parser):
|
||||
parser.add_option("--enable-context-switch-stats-dump", \
|
||||
action="store_true", help="Enable stats dump at context "\
|
||||
"switches and dump tasks file (required for Streamline)")
|
||||
parser.add_option("--generate-dtb", action="store_true", default=False,
|
||||
help="Automatically generate a dtb file")
|
||||
|
||||
# Benchmark options
|
||||
parser.add_option("--dual", action="store_true",
|
||||
|
||||
@@ -48,6 +48,7 @@ import m5
|
||||
from m5.defines import buildEnv
|
||||
from m5.objects import *
|
||||
from m5.util import addToPath, fatal, warn
|
||||
from m5.util.fdthelper import *
|
||||
|
||||
addToPath('../')
|
||||
|
||||
@@ -99,7 +100,9 @@ def build_test_system(np):
|
||||
options.num_cpus, bm[0], options.dtb_filename,
|
||||
bare_metal=options.bare_metal,
|
||||
cmdline=cmdline,
|
||||
external_memory=options.external_memory_system,
|
||||
ignore_dtb=options.generate_dtb,
|
||||
external_memory=
|
||||
options.external_memory_system,
|
||||
ruby=options.ruby,
|
||||
security=options.enable_security_extensions)
|
||||
if options.enable_context_switch_stats_dump:
|
||||
@@ -248,7 +251,8 @@ def build_drive_system(np):
|
||||
cmdline=cmdline)
|
||||
elif buildEnv['TARGET_ISA'] == 'arm':
|
||||
drive_sys = makeArmSystem(drive_mem_mode, options.machine_type, np,
|
||||
bm[1], options.dtb_filename, cmdline=cmdline)
|
||||
bm[1], options.dtb_filename, cmdline=cmdline,
|
||||
ignore_dtb=options.generate_dtb)
|
||||
|
||||
# Create a top-level voltage domain
|
||||
drive_sys.voltage_domain = VoltageDomain(voltage = options.sys_voltage)
|
||||
@@ -362,5 +366,34 @@ if options.timesync:
|
||||
if options.frame_capture:
|
||||
VncServer.frame_capture = True
|
||||
|
||||
if buildEnv['TARGET_ISA'] == "arm" and options.generate_dtb:
|
||||
# Sanity checks
|
||||
if options.dtb_filename:
|
||||
fatal("--generate-dtb and --dtb-filename cannot be specified at the"\
|
||||
"same time.")
|
||||
|
||||
if options.machine_type not in ["VExpress_GEM5", "VExpress_GEM5_V1"]:
|
||||
warn("Can only correctly generate a dtb for VExpress_GEM5_V1 " \
|
||||
"platforms, unless custom hardware models have been equipped "\
|
||||
"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)
|
||||
|
||||
elif buildEnv['TARGET_ISA'] != "arm" and options.generate_dtb:
|
||||
fatal("Can only generate dtb files for ARM systems.")
|
||||
|
||||
Simulation.setWorkCountOptions(test_sys, options)
|
||||
Simulation.run(options, root, test_sys, FutureClass)
|
||||
|
||||
Reference in New Issue
Block a user